HeartStone Destiny Wiki cqmicswikitide https://cqmics.wikitide.org/wiki/Main_Page MediaWiki 1.40.1 first-letter Media Special Talk User User talk HeartStone Destiny Wiki HeartStone Destiny Wiki talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Campaign Campaign talk TimedText TimedText talk Module Module talk CNBanner CNBanner talk Gadget Gadget talk Gadget definition Gadget definition talk Template:Infobox 10 11 377 2004-08-11T04:19:22Z wikipedia>Netoholic 0 Base Infobox template. use <nowiki>{{subst:Infobox}}</nowiki> to copy this content into your template as a base. wikitext text/x-wiki {| align="right" border="1" cellpadding="2" width="300" |- ! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big> |- | align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|290px|]]{{{image_caption}}} |- ! '''First item || {{{first_item}}} |- ! '''Second item''' || {{{second_item}}} |} 15f4264539dcb686c643bd9ad40c6fa365fa738d 378 377 2004-08-19T05:04:42Z wikipedia>Netoholic 0 wikitext text/x-wiki {| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;" |- ! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big> |- | align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|]]{{{image_caption}}} |- ! '''First item || {{{first_item}}} |- ! '''Second item''' || {{{second_item}}} |} c499ea555a165a9688072a43ebc5c4635e38020d 379 378 2005-04-10T17:34:33Z wikipedia>Bryan Derksen 0 close bolding wikitext text/x-wiki {| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;" |- ! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big> |- | align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|]]{{{image_caption}}} |- ! '''First item''' || {{{first_item}}} |- ! '''Second item''' || {{{second_item}}} |} 800a936e125da7fda093be5dc1c04a885fb8b088 380 379 2005-04-10T19:58:03Z wikipedia>Bryan Derksen 0 the image caption should go into the image's alt tag too, for accessibility reasons wikitext text/x-wiki {| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;" |- ! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big> |- | align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|{{{image_caption}}}]]{{{image_caption}}} |- ! '''First item''' || {{{first_item}}} |- ! '''Second item''' || {{{second_item}}} |} 9973e64db95907ff068185823604ec394f13b90d 381 380 2005-07-03T02:45:01Z 24.54.226.252 0 wikitext text/x-wiki {| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 463a9fcfc6c6802c7be045689b8eb344e1df54f7 382 381 2005-07-15T04:24:53Z wikipedia>Cantus 0 wikitext text/x-wiki {| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 4eb19bf1938087c99eb113641ecab1d97cdced9f 383 382 2005-07-15T09:11:49Z wikipedia>Talrias 0 Reverted edits by [[Special:Contributions/Cantus|Cantus]] to last version by 24.54.226.252 wikitext text/x-wiki {| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 463a9fcfc6c6802c7be045689b8eb344e1df54f7 384 383 2005-07-16T05:04:43Z wikipedia>まみぶ 0 rv unjustified revertion wikitext text/x-wiki {| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 4eb19bf1938087c99eb113641ecab1d97cdced9f 385 384 2005-07-16T05:30:17Z wikipedia>Cyrius 0 Reverted edits by [[Special:Contributions/まみぶ|まみぶ]] to last version by Talrias wikitext text/x-wiki {| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 463a9fcfc6c6802c7be045689b8eb344e1df54f7 386 385 2005-07-16T06:55:18Z 212.138.47.14 0 fmt wikitext text/x-wiki {| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 4eb19bf1938087c99eb113641ecab1d97cdced9f 387 386 2005-07-16T18:41:25Z wikipedia>Marknew 0 revert to edit by Cyrius wikitext text/x-wiki {| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 463a9fcfc6c6802c7be045689b8eb344e1df54f7 388 387 2005-07-17T04:40:19Z 212.92.4.205 0 wikitext text/x-wiki {| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right" |- | colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}} |- style="vertical-align: top;" |'''Motto''' |style="padding-right: 1em;" | {{{motto}}} |- style="vertical-align: top;" |'''Established''' |style="padding-right: 1em;" | {{{established}}} |- style="vertical-align: top;" |'''School type''' |style="padding-right: 1em;" | {{{type}}} |- style="vertical-align: top;" |'''President''' |style="padding-right: 1em;" | {{{head}}} |- style="vertical-align: top;" |'''Location''' |style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}} |- style="vertical-align: top;" |'''Campus''' |style="padding-right: 1em;" | {{{campus}}} |- style="vertical-align: top;" |'''Enrollment''' |style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br> |- style="vertical-align: top;" |'''Faculty''' |style="padding-right: 1em;" | {{{faculty}}} |- style="vertical-align: top;" |'''Mascot''' |style="padding-right: 1em;" | {{{mascot}}} |- style="vertical-align: top;" |'''{{{free_label}}}''' |style="padding-right: 1em;" | {{{free}}} |- style="vertical-align: top;" |'''Homepage''' |style="padding-right: 1em;" | {{{homepage}}} |} 4eb19bf1938087c99eb113641ecab1d97cdced9f 389 388 2005-07-17T05:21:23Z wikipedia>Netoholic 0 begin effort to reuse this for generic applications wikitext text/x-wiki <div class="infobox" style="width: 18em;"> {{{1}}} </div> 752a691cf2305137552deb23bd4fea4a5fcf45c2 390 389 2005-07-17T05:23:52Z wikipedia>Netoholic 0 wikitext text/x-wiki <div class="infobox" style="width: 20em;"> {{{1}}} </div> 9abd0b11919b32af8fe3a7232784f30853aca6ab 391 390 2005-07-17T05:46:33Z wikipedia>Netoholic 0 format a basic skeleton wikitext text/x-wiki {| class="infobox" style="width: 22em;" |- ! colspan="2" style="font-size: larger;" | {{{name}}} |- | colspan="2" style="text-align: center;" | {{{image}}} {{{caption}}} |- style="vertical-align: top;" ! Data 1 | {{data 1}} |- style="vertical-align: top;" ! Data 2 | {{data 2}} |- style="vertical-align: top;" ! Data 3 | {{data 3}} |- style="vertical-align: top;" ! Data 4 | {{data 4}} |- style="vertical-align: top;" | colspan="2" style="font-size: smaller;" | {{footnote}} |} b81c6acd7e215ed05c0c917b354cc5957566ff33 392 391 2005-07-17T05:47:01Z wikipedia>Netoholic 0 format a basic skeleton wikitext text/x-wiki {| class="infobox" style="width: 22em;" |- ! colspan="2" style="font-size: larger;" | {{{name}}} |- | colspan="2" style="text-align: center;" | {{{image}}} {{{caption}}} |- style="vertical-align: top;" ! Data 1 | {{{data 1}}} |- style="vertical-align: top;" ! Data 2 | {{{data 2}}} |- style="vertical-align: top;" ! Data 3 | {{{data 3}}} |- style="vertical-align: top;" ! Data 4 | {{{data 4}}} |- style="vertical-align: top;" | colspan="2" style="font-size: smaller;" | {{footnote}} |} fbf8dee1962ac9b920bb7a30e7e945a8f9002295 393 392 2005-10-11T20:01:44Z wikipedia>Melancholie 0 optimized; BTW: valign="top" would be better for Opera and other browsers wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 060fca8da5cd1184c238488d3003c8579dcf4837 394 393 2005-10-13T19:56:07Z wikipedia>Melancholie 0 test wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 70717c248c467cc59aaac5cbb922cdcf5b3c7c34 395 394 2005-10-13T19:59:05Z wikipedia>Melancholie 0 wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class{{{data 2}}}="hiddenStructure" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 423db5f0384a5fbd05d138b278541c79e061ef06 396 395 2005-10-13T20:04:20Z wikipedia>Melancholie 0 wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class{{Var1|1=X|1{{{data 2}}}=}}="hiddenStructure" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- | '''Data 3:''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 45461a55eb364b3aea7519764c4dc9112b7d792c 397 396 2005-10-13T20:05:56Z wikipedia>Melancholie 0 Revert to 2005-10-11 wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 060fca8da5cd1184c238488d3003c8579dcf4837 398 397 2005-10-17T20:00:14Z wikipedia>Melancholie 0 fix for IE wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- style="display:none" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;" | '''Data 2 (hidden if empty):''' | {{{data 2}}} |- style="display:none" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;" | '''Data 3 (hidden if empty or even undefined):''' | {{{data 3}}} |- style="vertical-align:top;" | '''Data 4:''' | {{{data 4}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> c5797e9fc95c182e9700594215ff9e62f265ce57 399 398 2005-10-21T01:20:58Z wikipedia>Melancholie 0 regrettably for [[Internet Explorer|IE]] and [[Dillo]] it is simply not possible to hide a parameter if undefined (only if empty) wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> dc6346575c8e225cd078c27086d1fedaa41e5557 400 399 2005-10-31T13:16:31Z 62.6.139.10 0 wikitext text/x-wiki <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 01c4f194688f9cf8e89f4650efafeb105bf47351 401 400 2005-10-31T15:11:18Z wikipedia>Papayoung 0 rv unexplained blanking wikitext text/x-wiki {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> dc6346575c8e225cd078c27086d1fedaa41e5557 402 401 2005-11-17T09:59:09Z wikipedia>Palx 0 wikitext text/x-wiki {| class="infobox" style="width:44em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> e8249c01f25f6edf1664d3c842f8a43245d9df14 403 402 2005-11-29T20:59:23Z 72.49.62.205 0 wikitext text/x-wiki <includeonly>{{checktemplate|name}} {{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly> {| class="infobox" style="width:44em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> 625e52e460f3cf7e70f95b59c3cbad917c10ec9a 404 403 2005-12-05T07:02:07Z wikipedia>AdamJacobMuller 0 add infobox template category wikitext text/x-wiki <includeonly>{{checktemplate|name}} {{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly> {| class="infobox" style="width:44em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> {| class="infobox" style="width:22em;" ! colspan="2" style="font-size:larger;" | {{{name}}} |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" | '''Data 1:''' | {{{data 1}}} |- style="vertical-align:top;" | '''Data 2:''' | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" | '''Data 3 (hidden if empty):''' | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> <noinclude> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 5f28e366eec55751dbe3932597dc24aec6d3fbb6 405 404 2005-12-10T16:15:36Z wikipedia>Netoholic 0 wikitext text/x-wiki <includeonly>{{checktemplate|name}} {{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly> {| class="infobox" style="width: 25em; text-align: left;" |+ <big>'''{{{name}}}'''</big> |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" ! Data 1: | {{{data 1}}} |- style="vertical-align:top;" ! Data 2: | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" ! Data 3 (hidden if empty): | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} <br style="clear:both;" /> <pre> Copy this code: {| class="infobox" style="width: 25em; text-align: left;" |+ <big>'''{{{name}}}'''</big> |- | colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}} |- style="vertical-align:top;" ! Data 1: | {{{data 1}}} |- style="vertical-align:top;" ! Data 2: | {{{data 2}}} |- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;" ! Data 3 (hidden if empty): | {{{data 3}}} |- style="vertical-align:top;" | colspan="2" style="font-size:smaller;" | {{footnote}} |} </pre> <noinclude> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 0fe87af42980c7b114fab7cc6bcf4e3b2e402dc3 406 405 2006-01-07T06:13:08Z wikipedia>Netoholic 0 update wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2 (data hidden if data2 empty): | {{{data2|}}} |- class="hiddenStructure{{{data3|}}}" ! Data 3 (row hidden if data3 empty): | {{{data3}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2 (data hidden if data2 empty): | {{{data2|}}} |- class="hiddenStructure{{{data3|}}}" ! Data 3 (row hidden if data3 empty): | {{{data3}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 82adc9f3b83d876c89bf29fe7739845ae0ad944b 407 406 2006-01-12T19:00:46Z wikipedia>Netoholic 0 another style wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2 (data hidden if data2 empty): | {{{data2|}}} |- class="hiddenStructure{{{data3|}}}" ! Data 3 (row hidden if data3 empty): | {{{data3}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 3bbcc0fbb94448b759e658eb1e18ba3d0054e60e 408 407 2006-01-12T19:01:16Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 6f74d396cafe9099b74c71ec0352f8310ef7071d 409 408 2006-01-12T19:01:37Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> 4c47618ebacd301d40bb53b6c8c3d4698befc620 410 409 2006-01-15T13:57:38Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] </noinclude> c82967d9aeb0dc8d9eeb9f9736c42798ecb39352 411 410 2006-01-15T13:58:24Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 4520e0af4e05d6c5a883f3c408acc25900c85458 412 411 2006-01-15T14:03:59Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 0ee264ab343b29cb5666b5422a88f8e92cf8f5d7 413 412 2006-01-15T14:08:22Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size:smaller;" | {{{footnotes}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 95962754d49b9919b930081d3e3a2abb2f0c147d 414 413 2006-01-15T14:09:01Z wikipedia>Netoholic 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> c221b10d637d464f6e8c92039f4ef143b65350a9 415 414 2006-01-17T19:56:28Z wikipedia>Ligulem 0 added some | in order to throw less {{{}}} stuff onto clients (look at html source) wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4|}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4|}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 00fc5578522870d909bef0f1ddbc2cb1c4afc2fb 416 415 2006-01-17T20:11:18Z wikipedia>Netoholic 0 rmv pipes from data4/5 - that's what data3 demonstrates wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 empty''}}} |- ! Data 3 (data hidden if data3 empty): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> fe57a79a289536cce1c9040690ac990b257fb181 417 416 2006-01-17T20:12:26Z wikipedia>Netoholic 0 clarify data3 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> a9730b3f7472a024b8ac9fb592f93e49e0783e55 418 417 2006-01-18T01:41:46Z wikipedia>Netoholic 0 testing something wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class="hiddenStructure{{{data4|}}}" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class="hiddenStructure{{{na{{{data5|}}}me|}}}" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 32d7189b97d0e4fdfa36573c1046ea7ee7add23f 419 418 2006-01-18T01:46:34Z wikipedia>Netoholic 0 further testing wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 254ef7c230794b3d1c56d94dfc59ca7d8bafb19f 420 419 2006-01-26T17:36:58Z wikipedia>Ligulem 0 See also [[Wikipedia:Infobox]], [[Wikipedia:hiddenStructure]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] *[[Wikipedia:hiddenStructure]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 200b2903078b2a1f7fece346d9ee3a09ada6120f 421 420 2006-01-29T03:15:24Z wikipedia>CBDunkerson 0 Improving accessibility wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b 422 421 2006-01-29T16:52:07Z wikipedia>Netoholic 0 rvt [[WP:POINT]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] *[[Wikipedia:hiddenStructure]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 200b2903078b2a1f7fece346d9ee3a09ada6120f 423 422 2006-01-29T17:23:53Z wikipedia>CBDunkerson 0 rvt - there is no [[WP:POINT]] violation in removing code which does not work properly. This template is a guide to infoboxes and should not promote a bad design. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b 424 423 2006-01-29T19:25:57Z wikipedia>Trödel 0 I agree with Netoholic on this - hiddenstructure should be in the example templates as the if templates, while not an emergency should be avoided wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- class{{{data4|}}}="hiddenStructure" ! Data 4 (row hidden if data4 empty): | {{{data4}}} |- class{{{na{{{data5|}}}me|}}}="hiddenStructure" ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] *[[Wikipedia:hiddenStructure]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 200b2903078b2a1f7fece346d9ee3a09ada6120f 425 424 2006-01-30T21:04:45Z wikipedia>Trödel 0 remove use of conditional templates including those using hiddenStructure wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 39a5f63276454325abeffa05173f54ec1071ef35 426 425 2006-01-30T21:06:33Z wikipedia>Netoholic 0 rmv all conditionals, except standard param defaults wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 9a52f34dedb325b57a1484c2709cdb323a0a9abb Template:Infobox 10 11 427 426 2006-01-30T21:12:47Z wikipedia>Netoholic 0 tpyo wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> b58c34a1bc89554f7a024a7f74e3a16f0785c6f5 428 427 2006-01-30T21:14:20Z wikipedia>Netoholic 0 img size wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 429 428 2006-01-31T08:09:31Z wikipedia>Crotalus horridus 0 Revert - conditionals are very important for infobox design, since there will often be optional parameters. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b 430 429 2006-01-31T12:05:54Z wikipedia>Trödel 0 use of conditionals should be avoided - having an instructional template advocate their use is contraray to that aim wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 431 430 2006-01-31T12:13:33Z wikipedia>Ligulem 0 rv. avoiding conditionals at the cost of template forking is bad. We will have them in MediaWiki anyway wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b 432 431 2006-01-31T14:27:40Z wikipedia>Marknew 0 Correct image tags wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 433 432 2006-01-31T16:52:04Z wikipedia>Netoholic 0 rvt to Trodel - as this is for inexperience template editors, conditionals should be avoided, per talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 434 433 2006-01-31T18:02:10Z wikipedia>Crotalus horridus 0 Conditionals are extremely useful in creating infobox templates. The description is also quite clear. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 435 434 2006-01-31T20:13:25Z wikipedia>Netoholic 0 rmv conditionals. This is "Infobox 101" wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 436 435 2006-01-31T20:32:47Z wikipedia>Locke Cole 0 rvt wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 437 436 2006-02-01T15:30:15Z wikipedia>Ta bu shi da yu 0 Reverted edits by [[Special:Contributions/Locke Cole|Locke Cole]] ([[User talk:Locke Cole|talk]]) to last version by Netoholic wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 438 437 2006-02-01T15:30:49Z wikipedia>Ta bu shi da yu 0 Oops. Unintentional rollback - apologies to all, this was a mistake. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 439 438 2006-02-01T22:46:11Z wikipedia>Trödel 0 remove conditionals until concensus on method and whether to even include them at all is reached wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 440 439 2006-02-01T22:50:33Z wikipedia>Locke Cole 0 rvt - consensus is on talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 441 440 2006-02-03T04:48:29Z wikipedia>Trödel 0 remove conditional instructions wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 442 441 2006-02-03T04:56:16Z wikipedia>Locke Cole 0 rvt as per talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 443 442 2006-02-03T05:11:11Z wikipedia>Netoholic 0 using conditionals sets a bad example for new template creators wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 444 443 2006-02-03T05:30:03Z wikipedia>Locke Cole 0 rvt per talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 445 444 2006-02-03T05:33:50Z wikipedia>Trödel 0 using conditionals should not be taught to new users wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 446 445 2006-02-03T05:36:12Z wikipedia>Locke Cole 0 rvt again, per talk; please pretend you two respect consensus wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 447 446 2006-02-03T05:37:37Z wikipedia>Netoholic 0 rvt, this is Infobox 101 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 448 447 2006-02-03T06:33:28Z wikipedia>Crotalus horridus 0 Reversion to revision 37961367 using [[:en:Wikipedia:Tools/Navigation_popups|popups]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 449 448 2006-02-03T20:09:41Z wikipedia>WGFinley 0 rv - this revision fails all guidelines for meta-template usage wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 450 449 2006-02-04T06:16:45Z wikipedia>Crotalus horridus 0 um... what guidelines for meta-template usage? [[WP:AUM]] is simply an essay at this point. And for hiding empty rows, {{qif}} is the best we currently have. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 451 450 2006-02-04T06:21:11Z wikipedia>WGFinley 0 rv wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 452 451 2006-02-04T06:39:08Z wikipedia>Crotalus horridus 0 Revert - see [[Template talk:Infobox]] for a lengthy justification. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 453 452 2006-02-04T08:26:35Z wikipedia>WGFinley 0 rv - and still no consensus to do it wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 454 453 2006-02-05T15:54:55Z wikipedia>Marknew 0 Added link to [[Template:Infobox Conditionals]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] *[[Template:Infobox Conditionals]] - advanced techniques that can be used to hide unused fields. [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 7a2e22a0330af3a5da0aa46b2861b1dc3af811ac 455 454 2006-02-06T07:59:59Z wikipedia>Trödel 0 including a link here is no better than explaining it here - it still encourages new users to use conditionals - when they should be discouraged from using them wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> d811ec8f129dcb111352b34ac529dfb3454cdd7f 456 455 2006-02-06T08:02:30Z wikipedia>Locke Cole 0 rvt - sigh wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] *[[Template:Infobox Conditionals]] - advanced techniques that can be used to hide unused fields. [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 7a2e22a0330af3a5da0aa46b2861b1dc3af811ac 457 456 2006-02-06T08:07:40Z wikipedia>Netoholic 0 Category is good enough. put "see also" on talk, if needed wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 458 457 2006-02-06T08:08:42Z wikipedia>Locke Cole 0 rvt - have it your way, I'm not compromising anymore wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 459 458 2006-02-10T13:33:41Z wikipedia>Trödel 0 this latest change is very confusing wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 648c371242419fb8c940326669989ef6c7381302 460 459 2006-02-11T02:19:44Z wikipedia>Locke Cole 0 rvt - yes, it is very confusing [[WP:OWN]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 461 460 2006-02-11T03:17:59Z wikipedia>Netoholic 0 we had a compromise, see talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 648c371242419fb8c940326669989ef6c7381302 462 461 2006-02-11T03:18:32Z wikipedia>Netoholic 0 we had a compromise, see talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 463 462 2006-02-11T05:09:38Z wikipedia>Locke Cole 0 rvt - I looked at the talk page, I see nothing new; the only compromise there that was supported has been reverted by you and Trodel wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 464 463 2006-02-12T04:37:21Z wikipedia>Netoholic 0 we had a compromise (create alternate advanced template), see talk wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 465 464 2006-02-12T04:44:05Z wikipedia>Locke Cole 0 rvt - the compromise included linking to the advanced template from this template, but that was rejected wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 466 465 2006-02-13T18:21:09Z wikipedia>Trödel 0 The compromise is linked to on the talk page - wikipedians who can't find it on the talk page should not be using an advance technique like that wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 467 466 2006-02-13T22:37:59Z wikipedia>Locke Cole 0 rvt - then it appears we don't have a compromise anymore; I'll be reverting this at will since you seem unwilling to compromise wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 468 467 2006-02-14T05:20:07Z wikipedia>Netoholic 0 reverting this "at will" is not an option. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 469 468 2006-02-14T05:32:50Z wikipedia>Locke Cole 0 rvt - it is for me if it is for you wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 470 469 2006-02-16T04:54:40Z wikipedia>Netoholic 0 removing complex code, per agreement on talk by several contributors wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 471 470 2006-02-16T05:07:35Z wikipedia>Locke Cole 0 rvt - compromise was dismissed by Trodel and Netoholic, reverting to original wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 472 471 2006-02-19T05:43:10Z wikipedia>Netoholic 0 rvt to less complex code wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 473 472 2006-02-19T07:20:02Z wikipedia>Locke Cole 0 rvt - it's only complicated until editors see it in action and get a chance to learn it, via this sample infobox wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 474 473 2006-02-19T08:09:25Z wikipedia>Netoholic 0 rvt per compromise, which create [[Template:Infobox Conditionals]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 48b3ddde634a23873dfabc7bdd26242702cf87f4 475 474 2006-02-19T08:18:19Z wikipedia>Locke Cole 0 rvt - part of that compromise was placing a link to it from here, which you and Trodel rejected wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 476 475 2006-02-19T08:28:52Z wikipedia>Jtkiefer 0 protected wikitext text/x-wiki <noinclude>{{protect}}</noinclude> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> b544f6dbf8db5a56af088320bed2f2ad65ef9b1d Template:Infobox 10 11 477 476 2006-04-18T22:59:40Z wikipedia>CBDunkerson 0 Unprotected Template:Infobox: Unprotecting - hopefully #if: has resolved the dispute by superceding both methods wikitext text/x-wiki <noinclude>{{protect}}</noinclude> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> b544f6dbf8db5a56af088320bed2f2ad65ef9b1d 478 477 2006-04-18T23:00:31Z wikipedia>CBDunkerson 0 Removed protection - assume #if: has resolved the dispute wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code <pre> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} ! Data 5 (row hidden if data5 not empty): | {{{data5}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} </pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 361f044c351974d72f386f272aaa5b2a4fe66170 479 478 2006-04-19T03:43:29Z wikipedia>Freakofnurture 0 cleanup, convert qif to #if: wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4|}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{na{{{data5|}}}me|}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 701a37cfebda4b9d298b1b6af06b1417d7532439 480 479 2006-04-19T14:59:18Z wikipedia>The editor1 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{na{{{data5<includeonly>|</includeonly>}}}me<includeonly>|</includeonly>}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 3ad49feb9e32de0d11788ad1e51a2d4d7333139c 481 480 2006-04-19T15:08:36Z wikipedia>The editor1 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{na{{{data5<includeonly>|</includeonly>}}}me|}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> e9398df130f614eeba5e90cadd16780786f31516 482 481 2006-04-19T15:09:39Z wikipedia>The editor1 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{na{{{data5|}}}me<includeonly>|</includeonly>}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> f8fcd98f7538af8b0eb2b4977f45813cef2e0cba 483 482 2006-04-19T17:11:25Z wikipedia>Marknew 0 Replace data5 "hack" with something clearer that *appears* to work in the same way. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{data5<includeonly>|</includeonly>}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 22f4f95e79ac5a67436acaf9de0db29c101cbe70 484 483 2006-04-19T17:12:42Z wikipedia>Marknew 0 attempt number 2... wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == :''see [[Template talk:{{PAGENAME}}|talk page]].'' ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 422d2be7576a4b3208f92b4aadd9a5a21b59b7a8 485 484 2006-04-21T08:50:12Z wikipedia>Marknew 0 Restored Usage instructions (none available on the talk page) wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} {{#if:{{{data4|}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }} {{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[Category:Templates using ParserFunctions|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 813fbd11f3432b843b2da29a2c544c0e7b5ed613 486 485 2006-04-21T19:28:45Z wikipedia>Netoholic 0 rmv conditionals. this is a _basic_ template for new template editors. Conditionals are not _basic_ tools. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb 487 486 2006-04-21T20:06:27Z wikipedia>CBDunkerson 0 Protected Template:Infobox: Contents of page still disputed. Restoring protection and instituting straw poll. [edit=sysop:move=sysop] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb 488 487 2006-04-21T20:07:12Z wikipedia>CBDunkerson 0 Adding protection template. See Talk page. wikitext text/x-wiki {{protected}} {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 87873f27dfe8a22d979653137591ffaa2a3196f5 489 488 2006-04-21T20:09:07Z wikipedia>CBDunkerson 0 Adding 'noinclude' tags since some pages are actually transcluding this one. wikitext text/x-wiki <noinclude>{{protected}}</noinclude> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 914002da8af41efe4a029f1ef8950fd039bc80b0 490 489 2006-05-10T22:53:05Z wikipedia>CBDunkerson 0 Unprotected Template:Infobox: Unprotecting since consensus seems to be established wikitext text/x-wiki <noinclude>{{protected}}</noinclude> {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 914002da8af41efe4a029f1ef8950fd039bc80b0 491 490 2006-05-10T22:54:46Z wikipedia>CBDunkerson 0 Unprotecting - Based on discussion this page should be used to demonstrate currently common infobox template techniques of all kinds. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb 492 491 2006-06-13T13:06:19Z wikipedia>Daviddecraene 0 /* Usage */ wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{data3|}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 5a9b90d030299e85e6045e9f67e91e5cc56827b0 493 492 2006-06-13T13:07:51Z wikipedia>Daviddecraene 0 sorry, accidently changed wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates|{{PAGENAME}}]] [[zh:Template:Infobox]] </noinclude> 3e0dca611e25a30609323033305e0eee832eeb7e 494 493 2006-06-18T17:06:33Z wikipedia>Circeus 0 sortkey wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[zh:Template:Infobox]] </noinclude> 13ddf977f9ddb1c1bd1810b2d125c19a6b1411d9 495 494 2006-08-07T10:30:41Z wikipedia>16@r 0 +fr wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> 86311f5e864cf8e6f960934b576dcfd408d577ae 496 495 2006-08-15T20:56:37Z 64.12.116.195 0 wikitext text/x-wiki {{#if:{{{nosubst|}}}|<div style="display:none;">}} {{#ifeq:{{NAMESPACE}}|{{<includeonly>subst:</includeonly>NAMESPACE}}| |{{error:not substituted|Infobox}}<div style="display:none;">}}{{#if:{{{nosubst|}}}|</div></div>}}{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> e3678fe0ce6b0e58104c9a7d4ab39efa106052e1 497 496 2006-08-15T21:32:37Z wikipedia>TheKMan 0 Reverted edits by [[Special:Contributions/64.12.116.195|64.12.116.195]] ([[User talk:64.12.116.195|talk]]) to last version by 16@r wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> 86311f5e864cf8e6f960934b576dcfd408d577ae 498 497 2006-09-07T12:22:23Z 213.178.224.161 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> 155634efd6553f5e3ee0d8cfa1b6f6bc88cb66ad 499 498 2006-09-25T23:27:00Z wikipedia>Djr xi 0 minor edit per [[Template talk:Infobox|talk page]] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> 3c0b460780dae187ad98dd2050cdc39f1aafc4ac 500 499 2006-09-29T06:49:48Z 75.4.20.90 0 /* Usage */ wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> d744a92ef9dcd0c4a2d5be92753ab1cf634e2105 501 500 2006-10-13T13:40:08Z wikipedia>Soroush Mesry 0 fa: wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> b85987e946bb708ebe825257e4e0e88bc146aafb 502 501 2006-10-21T05:32:57Z wikipedia>Mekmtl 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox2]] [[zh:Template:Infobox]] </noinclude> d36cdb58788de85efd0e12d351a3e2cc51114946 503 502 2006-10-21T05:34:52Z wikipedia>Mekmtl 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox (fr)]] [[zh:Template:Infobox]] </noinclude> ab6a3d7fb2e24d5dc226723ec04e6620cf19e36d 504 503 2006-10-21T05:39:42Z wikipedia>Mekmtl 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> b85987e946bb708ebe825257e4e0e88bc146aafb 505 504 2006-11-19T19:21:52Z 66.41.64.28 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:Circumsised penis - Flacid and Erect - High Res2.jpg|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> a83f37edb882d09a0f6fcba96a6e29eed35df9cd 506 505 2006-11-19T19:23:55Z wikipedia>DragonRouge 0 rvv wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> b85987e946bb708ebe825257e4e0e88bc146aafb 507 506 2006-12-21T20:03:59Z wikipedia>Jtg920 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{Test}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> 055e92fd52dd5f67c793fee5e8b0c8bcb7383667 508 507 2006-12-21T20:04:21Z wikipedia>Jtg920 0 wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> b85987e946bb708ebe825257e4e0e88bc146aafb 509 508 2006-12-30T03:25:53Z wikipedia>Andrew Gray 0 Protected Template:Infobox: high-risk template [edit=sysop:move=sysop] wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] </noinclude> b85987e946bb708ebe825257e4e0e88bc146aafb 510 509 2007-01-10T18:39:04Z wikipedia>J.smith 0 /* See also */ + [[ia:Patrono:Infobox]] inerwiki link, per talkpage request. wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy this code and paste it into a new blank page: <pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;" |+ style="font-size: larger;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}</pre> ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] [[ia:Patrono:Infobox]] </noinclude> 7f4e54ae45c8252bac5b23fcd13cd0b2281c0697 511 510 2007-04-01T14:12:38Z wikipedia>CBM 0 change instructions to eliminate redundancy wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |}<noinclude> <br style="clear:both" /> == Usage == Copy the source of this template (available from the '''view source''' link) and paste it into a new blank page. Only the part up to, but not including, the tag <code>&lt;noinclude></code> is necessary. ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] [[ia:Patrono:Infobox]] </noinclude> 9e0a7a17d0eecf11d0790be0f10cf2916ef583be 512 511 2007-04-01T14:15:16Z wikipedia>CBM 0 add newline wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} <noinclude> <!-- TO MAKE A NEW TEMPLATE: copy the source up to, but not including, the "noinclude" line into a new page. --> <br style="clear:both" /> == Usage == Copy the source of this template (available from the '''view source''' link) and paste it into a new blank page. Only the part up to, but not including, the tag <code>&lt;noinclude></code> is necessary. ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[zh:Template:Infobox]] [[ia:Patrono:Infobox]] </noinclude> 25ea020bd547c7c36ece709c32e8ad9ec06392ba Template:Ambox 10 18 661 2007-09-09T10:02:46Z wikipedia>Davidgothberg 0 Copied and modified the code from [[Wikipedia:Template standardisation/issuebox]]. wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-arrows.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> === The article message box meta template === This page is the meta template "ambox" that uses CSS classes for pretty much all its looks and that uses default images and has some other nifty features. For usage demonstration, parameter explanations, the CSS code you need and more, see [[Wikipedia:Template standardisation/issuebox demo]]. --[[User:Davidgothberg|David&nbsp;Göthberg]]&nbsp;<small>([[User talk:Davidgothberg|talk]])</small> 10:02, 9 September 2007 (UTC) </noinclude> fa94bddc272dd67ffe7ccd85d7dfba119df1e6a8 662 661 2007-09-09T10:55:58Z wikipedia>Davidgothberg 0 Added doc subpage templates. wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-arrows.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> d7a3c2ffb5affd78b6a4cb3c0a87221a67969231 663 662 2007-09-09T22:54:00Z wikipedia>Davidgothberg 0 Changed default merge/split/transwiki image to Edit-copy.svg since I think that one works for all those cases. wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Edit-copy.svg|40px]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> f1eb38e120aeb3f3326a0d78eda3f28ce71afbff 664 663 2007-09-10T02:13:44Z wikipedia>Davidgothberg 0 Slight change in default merge/split/transwiki image. wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Edit-copy-purple.gif]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 0fe030dc7fd6ce63f96f42c677084d6d9e359aee 665 664 2007-09-10T06:34:15Z wikipedia>Davidgothberg 0 New default image: Merge-split-transwiki default.svg wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 2be6e185648a112012adfa970eb1f813e2419bfb 666 665 2007-09-11T04:32:38Z wikipedia>MZMcBride 0 converted to wikisyntax; optimized code wikitext text/x-wiki {| class="ambox {{#switch:{{{type|}}} |serious =ambox-serious |content =ambox-content |style =ambox-style |merge =ambox-merge |notice =ambox-notice |#default=ambox-notice }}" {{#ifeq:{{{image}}}|none|<!-- image=none -->|<!-- else --> {{!}} class="ambox-image" {{!}} <!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}|{{{image}}}|<!-- No image param --> {{#switch:{{{type|}}} |serious =[[Image:Stop hand nuvola.svg|40px]] |content =[[Image:Emblem-important.svg|40px]] |style =[[Image:Broom icon.svg|40px]] |merge =[[Image:Merge-split-transwiki default.svg]] |notice =[[Image:Info non-talk.png|40px]] |#default=[[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> }}<!-- End ifeq image==none --> {{!}} {{{text}}} {{#if:{{{imageright|}}}| {{!}} class="ambox-imageright">{{{imageright}}} }} |}<noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> ae21199885ee8ac455f91a45a3aba0c9a4da3063 667 666 2007-09-11T06:27:05Z wikipedia>Davidgothberg 0 Revert. MZMcBride: You increased both the pre- and post-expand size, and made it less robust in several ways. I'll explain more on the talk page. wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 2be6e185648a112012adfa970eb1f813e2419bfb 668 667 2007-09-14T19:10:11Z wikipedia>Flyguy649 0 Protected Template:Ambox: High risk template transcluded on many article boxes [edit=sysop:move=sysop] [cascading] wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 2be6e185648a112012adfa970eb1f813e2419bfb 669 668 2007-09-14T19:49:03Z wikipedia>MZMcBride 0 Changed protection level for "[[Template:Ambox]]": cascading locks the /doc subpage [edit=sysop:move=sysop] wikitext text/x-wiki <table class="ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 2be6e185648a112012adfa970eb1f813e2419bfb 670 669 2007-09-14T21:38:01Z wikipedia>RockMFR 0 this should use the metadata class to remain compatible with stylesheets using .metadata wikitext text/x-wiki <table class="metadata ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 8d1169a9e87fb21168343895cafc567036b2289e 671 670 2007-09-15T04:50:21Z wikipedia>Circeus 0 someone forgot this... wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> debfec0ede3702d4c7e72615ea3fbfad021282e3 672 671 2007-09-15T16:12:59Z wikipedia>WikiLeon 0 restore box figure without the left border. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}" style="clear: both; width: 80%; margin: 0 0 0 10%; border-collapse: collapse; background: #f8fcff; border: 1px solid #aaa;"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 43477d9bff87eb0463d0f440269fff65fdde74a9 673 672 2007-09-15T16:21:12Z wikipedia>MZMcBride 0 rm spaces after mod to template doc wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}" style="clear: both; width: 80%; margin: 0 0 0 10%; border-collapse: collapse; background: #f8fcff; border: 1px solid #aaa;"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 4ff15820e4708f90ddec788695a2e31ff9bd5632 674 673 2007-09-15T16:23:58Z wikipedia>Ais523 0 [[WP:UNDO|Undid]] revision 158071076 by [[Special:Contributions/WikiLeon|WikiLeon]] ([[User talk:WikiLeon|talk]]) (seems to have broken the template) wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"><tr> {{#ifeq:{{{image}}}|none| <!-- image=none --> |<!-- else --> <td class="ambox-image"><!-- -->{{#ifeq:{{{image}}}|blank| <!-- image=blank --> |<!-- image != blank --> {{#if:{{{image|}}}| {{{image}}} |<!-- No image param --> {{#switch:{{{type|}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | #default = [[Image:Info non-talk.png|40px]] }}<!-- End #switch type --> }}<!-- End if image --> }}<!-- End ifeq image==blank --> </td> }}<!-- End ifeq image==none --> <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright">{{{imageright}}}</td> }} </tr></table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 365a370cece3e0c0c0fc72a5deb4909ed7afa7b5 Template:Ambox 10 18 675 674 2007-09-15T23:34:03Z wikipedia>AzaToth 0 testing wikitable code, and changes of logic, do not kill me it if's not working wikitext text/x-wiki {| class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}" |- {{#ifeq:{{{image}}}|none | <!-- no image cell --> | {{!}} class="ambox-image" {{!}} {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }} }} | {{{text}}} {{#if:{{{imageright|}}} | {{!}} class="ambox-imageright" {{!}} {{{imageright}}} }} |}<noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> f2841fb57d1daa057f166630d0571e896bbcb384 676 675 2007-09-15T23:54:39Z wikipedia>AzaToth 0 restore to html syntax wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> e687c9e21396110ff6270ba30470a117a800e0f9 677 676 2007-09-15T23:55:22Z wikipedia>AzaToth 0 restore to html syntax wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 2655dd9962d1251852ac565ce3add834028d6289 678 677 2007-09-16T00:14:41Z wikipedia>Denelson83 0 Adding growth wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 0a843b80a3442f562d7b6fda7a6afc701d34ebe9 679 678 2007-09-16T00:52:07Z wikipedia>AzaToth 0 Adding an image for "growth", the idea is "to look further" wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|growth}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Blue eye.svg|35px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> b6eee22aef181a82860e6f81dff2561cebd2fca8 680 679 2007-09-16T00:53:08Z wikipedia>AzaToth 0 sorry, something went wrong there wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Blue eye.svg|35px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 16d3a66bf959ab2731342a50b13a8b4f238e16d3 681 680 2007-09-16T01:19:44Z wikipedia>Denelson83 0 Green eye for growth wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green eye.svg|35px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 5746068663ff9fd221ef0ed5e78006b5e7437cb2 682 681 2007-09-16T02:20:12Z wikipedia>Denelson83 0 Find another image for "growth" wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = <!-- Find an SVG plant image to go here --> | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> b323c934703f3998addcea6ac3c41515dddefabb 683 682 2007-09-16T04:13:42Z wikipedia>Denelson83 0 This should do for now wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Gxermo2.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> e65d8d1e95aabfd31bcbb1a414fbf836af091be6 684 683 2007-09-16T05:03:12Z wikipedia>David Levy 0 green plus symbol as "growth" icon wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 9fbb506511b8aff9fa03133bc41f6db3714518c7 685 684 2007-09-16T06:02:09Z wikipedia>David Levy 0 + optional style parameter wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}} <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 6485c75a46066f84b766f488dfe511994e692215 686 685 2007-09-16T17:14:50Z wikipedia>Animum 0 Per request on talk wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 10d014a0aebbe46cd50fced18ff03798c3358f9f 687 686 2007-09-16T20:02:18Z wikipedia>Ilmari Karonen 0 work around parser bug: having <td>{{{text}}}</td> on one line breaks paragraph formatting within {{{text}}} wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> f55afc354a27a9966a7d218d4921a163e7e5ff3d 688 687 2007-09-16T21:55:04Z wikipedia>Misza13 0 wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:none|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 50a77ed3e88b8f17d2ea305a7737b060196043cb 689 688 2007-09-16T21:55:23Z wikipedia>Misza13 0 [[WP:UNDO|Undid]] revision 158364213 by [[Special:Contributions/Misza13|Misza13]] ([[User talk:Misza13|talk]]) wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> f55afc354a27a9966a7d218d4921a163e7e5ff3d 690 689 2007-09-17T00:05:08Z wikipedia>David Levy 0 - padding added as a side effect of the 20:02 edit wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 5811cef20fb121d80ebc19d46bd73adad91ff911 691 690 2007-09-17T00:35:29Z wikipedia>David Levy 0 This continues to add top padding in some instances. Until a better solution is found, please manually insert paragraph breaks via HTML. wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 4944a917f022cf2f3a625fce08529d458d5735ac 692 691 2007-09-17T02:48:39Z wikipedia>Ilmari Karonen 0 rv, the padding is an unavoidable side effect of having multiple paragraphs within a table cell, given the CSS styles applied to paragraph tags wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td> {{{text}}} </td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> f55afc354a27a9966a7d218d4921a163e7e5ff3d 693 692 2007-09-17T02:54:33Z wikipedia>David Levy 0 Okay, but that's no reason to mess up the vast majority of templates that do not contain multiple paragraphs. This adds ugly padding to ALL OF THEM. wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:Green plus icon.png]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 4944a917f022cf2f3a625fce08529d458d5735ac 694 693 2007-09-18T04:59:07Z wikipedia>David Levy 0 new "growth" icon wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | growth = ambox-growth | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | growth = [[Image:N write green black.svg|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 160446ce42a7c733af87cc11bfa9dadcdfe12cad 695 694 2007-10-06T19:23:05Z wikipedia>Nihiltres 0 Removed growth type per editprotected on talk by [[User:Jrockley|Jrockley]] wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> {{#ifeq:{{{image}}}|none | <!-- no image cell --> | <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = <!-- empty image cell --> | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</td> }} <td>{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"> {{{imageright}}} </td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 94c31ac8239445a9b47545ad579450643d7a11d8 696 695 2007-10-15T22:04:33Z wikipedia>GDonato 0 per request, let's send the job queue up :) wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> <td class="ambox-image"> {{#ifeq:{{{image}}}|none | <!-- no image cell; empty cell necessary for text cell to have 100% width --> | <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = [[Image:Spacer.gif]] | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</div> }}</td> <td class="ambox-text">{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 3c073ad421c525be5596ceac51da9e5a26b48692 697 696 2007-11-08T17:26:12Z wikipedia>Edokter 0 Reaplece [[:Image:Info non-talk.png]] with protected [[:Image:Information icon.svg]] wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> <td class="ambox-image"> {{#ifeq:{{{image}}}|none | <!-- no image cell; empty cell necessary for text cell to have 100% width --> | <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Information icon.svg|40px]] | blank = [[Image:No image.svg]] | #default = {{{image|[[Image:Information icon.svg|40px]]}}} }}</div> }}</td> <td class="ambox-text">{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 39ba7e5f8fd38b407c1bc244b74bbe54b49e86f8 698 697 2007-11-09T10:07:17Z wikipedia>David Levy 0 Reverted. Apart from making the icon smaller and switching to a hue that doesn't match the template as well, what did that accomplish? wikitext text/x-wiki <table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}} | serious = ambox-serious | content = ambox-content | style = ambox-style | merge = ambox-merge | notice = ambox-notice | #default = ambox-notice }}"> <tr> <td class="ambox-image"> {{#ifeq:{{{image}}}|none | <!-- no image cell; empty cell necessary for text cell to have 100% width --> | <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}} | serious = [[Image:Stop hand nuvola.svg|40px]] | content = [[Image:Emblem-important.svg|40px]] | style = [[Image:Broom icon.svg|40px]] | merge = [[Image:Merge-split-transwiki default.svg]] | notice = [[Image:Info non-talk.png|40px]] | blank = [[Image:No image.svg]] | #default = {{{image|[[Image:Info non-talk.png|40px]]}}} }}</div> }}</td> <td class="ambox-text">{{{text}}}</td> {{#if:{{{imageright|}}}| <td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{template doc}} <!-- Add categories and inter-wikis to the /doc subpage, not here! --> </noinclude> 0a874d077735d04f84f8316cdb3987cfd316acf0 Template:Infobox 10 11 513 512 2007-12-19T11:48:07Z wikipedia>TadejM 0 +iw: sl wikitext text/x-wiki {| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;" |- | colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}''' |- | colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}} |- ! Data 1: | {{{data1}}} |- ! Data 2: | {{{data2|''this text displayed if data2 not defined''}}} |- ! Data 3 (data hidden if data3 empty or not defined): | {{{data3|}}} |- | colspan="2" style="font-size: smaller;" | {{{footnotes|}}} |} <noinclude> <!-- TO MAKE A NEW TEMPLATE: copy the source up to, but not including, the "noinclude" line into a new page. --> <br style="clear:both" /> == Usage == Copy the source of this template (available from the '''view source''' link) and paste it into a new blank page. Only the part up to, but not including, the tag <code>&lt;noinclude></code> is necessary. ==See also== *[[Wikipedia:Infobox]] [[Category:infobox templates| ]] [[ar:قالب:قالب معلومات]] [[fa:الگو:دادان]] [[fr:Modèle:Infobox]] [[sl:Predloga:Infopolje]] [[zh:Template:Infobox]] [[ia:Patrono:Infobox]] </noinclude> d3c252cb33d919636bbfac4286f778ce39e36231 514 513 2008-01-23T18:34:26Z wikipedia>Bryan Derksen 0 replacing with a functioning meta-template I prototyped at [[User:Bryan Derksen/Template sandbox]]. wikitext text/x-wiki <table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr> <td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr> {{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}} {{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }} {{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }} {{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }} {{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }} {{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }} {{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }} {{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }} {{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }} {{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }} {{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }} {{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }} {{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }} {{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }} {{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }} {{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }} {{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }} {{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }} {{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }} {{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }} {{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }} {{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{template doc}} </noinclude> b8b36473f350a332a9c73310b0683f2f0f89f8b9 515 514 2008-01-23T18:42:17Z wikipedia>Bryan Derksen 0 produces a lot of blank lines that my sandboxed version didn't. Removing a bunch of hard returns to try fixing it. wikitext text/x-wiki <table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr> <td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr> {{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}} {{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }} {{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }} {{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }} {{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }} {{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }} {{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }} {{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }} {{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }} {{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }} {{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }} {{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }} {{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }} {{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }} {{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }} {{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }} {{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }} {{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }} {{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }} {{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }} {{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }} {{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{template doc}} </noinclude> 2efacc831c6a5364dc39aa0c9360da476028dbb3 516 515 2008-01-23T18:46:08Z wikipedia>Bryan Derksen 0 removing yet more wikitext text/x-wiki <table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{template doc}} </noinclude> e2cf7b4eb7eb5f3b4a926ca4be8afc669f8893ca 517 516 2008-01-23T18:52:27Z wikipedia>Bryan Derksen 0 protection template wikitext text/x-wiki <table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 1529f9adf4c7cd0d6f01e2276a0c055b42db7427 518 517 2008-01-23T19:11:18Z wikipedia>Bryan Derksen 0 add an if statement so that rows with labels but no data are hidden by default wikitext text/x-wiki <table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 89ddfb1336d794aa83698fb3da7540c09aa0dc55 519 518 2008-01-23T19:53:36Z wikipedia>Bryan Derksen 0 removing "bordered" class to make this more generally "default" wikitext text/x-wiki <table class="infobox" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 1b59a95f3f7e316cdc3265c8db35ad15c79d7d7a 520 519 2008-01-23T20:04:24Z wikipedia>Bryan Derksen 0 taking out predefined default width, it was rather wide wikitext text/x-wiki <table class="infobox" style="text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 4892ec765b6ced7a424350bdf42b7e5822eecdbf 521 520 2008-01-24T07:35:26Z wikipedia>Bryan Derksen 0 Looks like 25em is standard after all, according to [[Wikipedia:Manual of Style (infoboxes)]] wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 3b923cd35488afa0da0d6a1f43c9572889eb8c47 522 521 2008-01-25T06:39:28Z wikipedia>Bryan Derksen 0 doubling capacity to handle infoboxes of up to 40 rows. wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 6dc2ebc59db05e8921e26abc88bc1ab87229f19a 523 522 2008-01-25T18:52:26Z wikipedia>Bryan Derksen 0 small modification of default style; data rows without labels are centered. This seems to be common practice in existing infoboxes. wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> b4c4409ae014732fbcf3bfd24b2d06aaf53e76c8 524 523 2008-03-07T05:26:43Z wikipedia>Bryan Derksen 0 adding an "above" parameter and changing the meaning of "title" to allow this template to match the other common style of adding a title to infoboxes. I'll update all the existing uses. wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <th colspan="2" style="text-align:center; background:#ccf; {{{abovestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{abovestyle|}}};border:none;|mini=1}}</span>{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> f9007a7d8403a0604df5d5925c54e51a03ec9e29 525 524 2008-03-07T05:28:15Z wikipedia>Bryan Derksen 0 reverting, need to tinker with default styles a bit more wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <tr><!-- Header --><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td> </tr><!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> b4c4409ae014732fbcf3bfd24b2d06aaf53e76c8 526 525 2008-03-07T05:40:32Z wikipedia>Bryan Derksen 0 I believe I have it this time. wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{abovestyle|}}};font-size:xx-small;border:none;|mini=1}}</span>{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 4432f0f8281a07cfb74110a964e86c1114d5f257 527 526 2008-03-07T19:52:12Z wikipedia>Bryan Derksen 0 move v/d/e down to the bottom to account for alternate title styles. Also, this allows better centering. wikitext text/x-wiki <table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} <tr> <td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td> </tr> </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 42df86bd2b3f0414a046ec88743ad2a2379d26fd 528 527 2008-03-12T21:17:47Z wikipedia>Bryan Derksen 0 Adding class parameters to support hCard microformats wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} <tr> <td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td> </tr> </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 50369027df6f83aa9d4c961aaf989748fb0d2f04 529 528 2008-03-13T20:22:55Z wikipedia>Bryan Derksen 0 add class parameters for title and above, since some vcard infoboxes out there use these for data wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}} <tr> <td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td> </tr> </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 94e2abc1c06d153396eb9ee21cc55bd1f8ea30e8 530 529 2008-03-16T19:52:58Z wikipedia>Bryan Derksen 0 making the navbar optional, as discussed in talk. Defaults to off. wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{enablenav|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 1d5335bbe7395548e8bafadc2bebc75844e8b63d 531 530 2008-03-16T19:58:22Z wikipedia>Bryan Derksen 0 actually, using a different approach to eliminate the proliferation of redundant parameters wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> ac34c38a4877f056591926631de1ac081ecd4742 532 531 2008-03-26T05:57:47Z wikipedia>Bryan Derksen 0 increasing row limit to 60, as requested in talk wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 748ffee8f8011b91f46816f57b72901e11f1535d 533 532 2008-03-26T14:57:26Z wikipedia>Bryan Derksen 0 cranking it up to 80 wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr> <td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td> </tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr> <td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td> </tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 23332127497accbbbbad12a9d0055edda541aa58 534 533 2008-04-02T05:46:28Z wikipedia>Bryan Derksen 0 With woe and regret, I remove the default navbox-style shading as discussed in talk. wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"> <!-- Caption--> {{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header--> {{#if:{{{above|}}}| <tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}} </td></tr> }} <!-- Image--> {{#if:{{{image|}}}| <tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span> </td></tr> }}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 66d929291b67d256b149a2f50ce9bd3d12ffd02c 535 534 2008-04-17T14:50:59Z wikipedia>Edokter 0 Removing stray linebreaks wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 1b087762b5b5e91e10d490d5dc1809f1ab062814 536 535 2008-04-17T22:20:56Z wikipedia>Bryan Derksen 0 changing font size to 88%, as discussed in talk wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 88%; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> e1225279f0846c80592068beede2507ff4fc0dee 537 536 2008-04-19T14:31:33Z wikipedia>Edokter 0 further font fixes, default width wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 120%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 120%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> a8e49998a0ce9e781a9e08b74d570370845bab0b 538 537 2008-04-19T14:33:51Z wikipedia>Edokter 0 further font fixes (filled in wrong value) wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> e158b75b35700e5a5b65a594160ae1672c3bd9a9 Template:Ambox 10 18 699 698 2008-04-30T00:25:07Z wikipedia>Davidgothberg 0 Planned new version from /sandbox. Many new additions and fixes. See discussions at [[Wikipedia talk:Article message boxes]]. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy <!-- Can be used from 19 May 2008 --> | delete <!-- delete = serious --> | serious = ambox-delete | content = ambox-content | style = ambox-style | move <!-- move = merge --> | merge = ambox-merge <!--ambox-move can be used 20 May 2008--> | protection = ambox-protection | notice = ambox-notice | #default = ambox-notice }}" style="{{{style|}}}"> <tr> <td class="ambox-image"> {{#ifeq:{{{image|}}}|none | <!-- No image cell; empty cell necessary for text cell to have 100% width --> | <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | delete | serious = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | move | merge = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice = [[Image:Ambox notice.png|40x40px]] | blank = &nbsp; | #default = {{{image|[[Image:Ambox notice.png|40x40px]]}}} }}</div> }}</td> <td class="ambox-text" style="{{{textstyle|}}}">{{{text}}}</td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> e277912577dc3c271cbebc780ce7366f2c67f243 700 699 2008-05-25T08:11:11Z wikipedia>Davidgothberg 0 Planned fixes: Using new CSS class names (deployed for 30 days now). Fixing the empty "image=" parameter bug and the padding for the image=none case. And some other cleanup. (Tested in sandbox.) wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | delete <!-- delete = serious --> | serious = ambox-delete | content = ambox-content | style = ambox-style | move <!-- move = merge --> | merge = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | delete | serious = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | move | merge = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 22d88fe615f1f155f0c3e7e4edade11e6f558997 701 700 2008-08-17T18:48:27Z wikipedia>Happy-melon 0 note deprecated type values to prevent confusion wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | delete <!-- this value is **deprecated**, please don't use it! --> | serious = ambox-delete | content = ambox-content | style = ambox-style | move <!-- this value is **deprecated**, please don't use it! --> | merge = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | delete <!-- this value is **deprecated**, please don't use it! --> | serious = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | move <!-- this value is **deprecated**, please don't use it! --> | merge = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> fe21e7c52adb3368b9963ac8b6606a534ecaa01e 702 701 2008-08-17T20:41:12Z wikipedia>Happy-melon 0 whoops, should be THIS way round :D wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- this value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- this value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- this value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- this value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 96dd94c12ed5bea2c34e32411cbf16f95f137692 703 702 2008-08-18T21:21:05Z wikipedia>Happy-melon 0 add code to find amboxes using |type=merge and |type=serious, to correct so we can remove these types wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- this value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- this value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- this value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- this value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table>{{#ifeq:{{NAMESPACE}}|{{ns:template}}|{{#switch:{{{type|}}}|serious|merge=[[Category:Ambox templates using deprecated types|{{PAGENAME}}]]}}}}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 2626092ef3efd8b95a135fde3a771bfd032ff59d 704 703 2008-08-21T06:43:46Z wikipedia>Davidgothberg 0 Widening the detection and reporting of faulty "type" parameter to cover all namespaces. See [[Template talk:Tmbox#Deprecated ambox parameters]]. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- This value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- This value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- This value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- This value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> fe22b060dafe4d68287c1597f1fdbcca4947f4a8 705 704 2008-08-21T14:34:51Z wikipedia>Davidgothberg 0 Oops, how embarrassing, I had left a line break in the category name. Fixed. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- This value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- This value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- This value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- This value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 61063fede7da037eacd16f055c9c09ab0fa49a65 706 705 2008-09-14T16:23:47Z wikipedia>Davidgothberg 0 Decreasing the empty left image cell from a total of 3px width to 1px width. Can't be 0px since then boxes who are not filled with text don't stay 80% wide. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- This value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- This value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td> | <td class="ambox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- This value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- This value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 59627435dd090f159dd271ffb9aa2d4e6f8488fc 707 706 2008-09-27T16:03:57Z wikipedia>Davidgothberg 0 Updating to use "mbox-*" class names instead of "ambox-*". See [[Template talk:Mbox#Simpler to use class names]]. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- This value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- This value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td> | <td class="mbox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- This value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- This value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> df9e3b537247e3cbfcf4ee4d874e18752c1c1430 708 707 2008-10-03T22:40:56Z wikipedia>Davidgothberg 0 Adding the printing of an error message when invalid "type" parameter. Thus making it much easier to find which message box on a page is reporting an error. wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | serious <!-- This value is **deprecated**, please don't use it! --> | delete = ambox-delete | content = ambox-content | style = ambox-style | merge <!-- This value is **deprecated**, please don't use it! --> | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td> | <td class="mbox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | serious <!-- This value is **deprecated**, please don't use it! --> | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | merge <!-- This value is **deprecated**, please don't use it! --> | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing. ([[:Category:Ambox templates using deprecated types|learn more]])</div>[[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 9008b1fc3b64ec879c22553080f8b1eeb29c32ab 709 708 2009-01-04T10:36:08Z wikipedia>Happy-melon 0 these are now 'extinct' in the wild wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | delete = ambox-delete | content = ambox-content | style = ambox-style | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td> | <td class="mbox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing. ([[:Category:Ambox templates using deprecated types|learn more]])</div>[[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 4a8b1333d4614005b63d535544dd1ef8fca01921 710 709 2009-01-06T17:20:15Z wikipedia>Happy-melon 0 sync tracking cat with other mbox templates wikitext text/x-wiki <table class="metadata plainlinks ambox {{#switch:{{{type|}}} | speedy = ambox-speedy | delete = ambox-delete | content = ambox-content | style = ambox-style | move = ambox-move | protection = ambox-protection | notice <!-- notice = default --> | #default = ambox-notice }}" style="{{{style|}}}"> <tr> {{#ifeq:{{{image|}}}|none | <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td> | <td class="mbox-image"><div style="width: 52px;"> {{#ifeq:{{{image|}}}|blank | &nbsp; | {{#if:{{{image|}}} | {{{image}}} | {{#switch:{{{type|}}} | speedy = [[Image:Ambox speedy deletion.png|40x40px]] | delete = [[Image:Ambox deletion.png|40x40px]] | content = [[Image:Ambox content.png|40x40px]] | style = [[Image:Ambox style.png|40x40px]] | move = [[Image:Ambox move.png|40x40px]] | protection = [[Image:Ambox protection.png|40x40px]] | notice <!-- notice = default --> | #default = [[Image:Ambox notice.png|40x40px]] }} }} }}</div></td> }} <td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td> {{#if:{{{imageright|}}} | <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td> }} </tr> </table><!-- Detect and report usage with faulty "type" parameter: -->{{#switch:{{{type|}}} | <!-- No type fed, is also valid input --> | speedy | delete | content | style | move | protection | notice = <!-- Do nothing, valid "type" --> | #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing.</div>[[Category:Wikipedia message box parameter needs fixing|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace --> }}<noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 7d195df6fc92facd635c928993b6f197d4386f7d 711 710 2009-03-15T19:21:16Z wikipedia>Davidgothberg 0 Deploying the "small=left" feature, thus now using {{ambox/core}}. Tested in /sandbox and discussed in many places, see talk page. wikitext text/x-wiki {{#switch:{{{small|}}} | left = {{ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<noinclude> {{pp-template}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 77fdc1e4f9d5c88cc6e31a6d312caa5d806af3d9 712 711 2009-06-04T04:23:40Z wikipedia>Dragons flight 0 Autocategorize article message box templates, per proposal wikitext text/x-wiki {{#switch:{{{small|}}} | left = {{ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><noinclude> {{pp-template}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> da5888a4db8c3b83d49732581989b92f59c5d771 713 712 2009-06-04T06:32:21Z wikipedia>Dragons flight 0 sort on pagename wikitext text/x-wiki {{#switch:{{{small|}}} | left = {{ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes|{{PAGENAME}}]]}}}}</includeonly><!-- --><noinclude> {{pp-template}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> d00f654840ba2c3aab81883bc3b59af778e5a330 714 713 2009-07-05T16:47:36Z wikipedia>Happy-melon 0 remove category sortkey which is now the default after [[bugzilla:16552]] wikitext text/x-wiki {{#switch:{{{small|}}} | left = {{ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><noinclude> {{pp-template}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> da5888a4db8c3b83d49732581989b92f59c5d771 715 714 2009-10-15T11:01:01Z wikipedia>Rich Farmbrough 0 Add code for incorrectly substed templates, or minor tidy up using [[Project:AutoWikiBrowser|AWB]] wikitext text/x-wiki <!--{{Ambox}} begin-->{{#switch:{{{small|}}} | left = {{Ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{Ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><!--{{Ambox}} end--><noinclude> {{pp-template}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 0bf8d3cd6b936aa0e2dfad970ceca0f55cb3f4b5 716 715 2010-10-03T10:11:19Z wikipedia>WOSlinker 0 remove {{pp-template}} wikitext text/x-wiki <!--{{Ambox}} begin-->{{#switch:{{{small|}}} | left = {{Ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{Ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><!--{{Ambox}} end--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 3cf6d0cb7111edf610e4cb70a72b90131c3a297f 717 716 2010-11-18T23:53:27Z wikipedia>Rjanag 0 so that it can work if someone forgets text=... wikitext text/x-wiki <!--{{Ambox}} begin-->{{#switch:{{{small|}}} | left = {{Ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text|{{{1}}}}}} }} }} | #default = {{Ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text|{{{1}}}}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><!--{{Ambox}} end--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> b8b5cb43076e225acd547e953df2c6638aaf8f75 718 717 2010-11-19T01:06:04Z wikipedia>Edokter 0 Undid revision 397582199 by [[Special:Contributions/Rjanag|Rjanag]] ([[User talk:Rjanag|talk]]) should not rely on numbered parameters; text is not guaranteed to be {{{1}}}. wikitext text/x-wiki <!--{{Ambox}} begin-->{{#switch:{{{small|}}} | left = {{Ambox/core | small = left | type = {{{type|}}} | image = {{#if:{{{smallimage|}}} | {{{smallimage}}} | {{{image|}}} }} | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{#if:{{{smalltext|}}} | {{{smalltext}}} | {{{text}}} }} }} | #default = {{Ambox/core | type = {{{type|}}} | image = {{{image|}}} | imageright = {{{imageright|}}} | style = {{{style|}}} | textstyle = {{{textstyle|}}} | text = {{{text}}} }} }}<!-- --><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!-- --><!--{{Ambox}} end--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 3cf6d0cb7111edf610e4cb70a72b90131c3a297f 719 718 2011-02-13T17:15:09Z wikipedia>MSGJ 0 adding functionality for substitution detection and cleanup categorisation, per [[Wikipedia_talk:Manual_of_Style_(article_message_boxes)#Add_functionality_to_ambox|discussion]] wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} }} }}{{cat handler |main={{#if:{{{cat|}}} |{{#if:{{{date|}}} |[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}| |[[Category:Articles with invalid date parameter in template]] }} |[[Category:{{#if:{{{undated|}}} |{{{undated}}} |{{{cat}}} }}]] }} }}{{#if:{{{all|}}} |[[Category:{{{all}}}]] }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> cd73f404c9bed1d0fcb11fbda5c468034b5373b7 720 719 2011-02-13T18:24:39Z wikipedia>MSGJ 0 don't show documentation on sandbox or testcases wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} }} }}{{cat handler |main={{#if:{{{cat|}}} |{{#if:{{{date|}}} |[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}| |[[Category:Articles with invalid date parameter in template]] }} |[[Category:{{#if:{{{undated|}}} |{{{undated}}} |{{{cat}}} }}]] }} }}{{#if:{{{all|}}} |[[Category:{{{all}}}]] }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 5cfbada91d7514041ccbb78e01ca739bde85a970 Template:Infobox 10 11 539 538 2008-05-31T06:17:48Z wikipedia>Patrick 0 {{image class|{{{image}}}}} like in [[Template:Infobox_actor]] wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}" {{image class|{{{image}}}}}> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> a2a8d863183bb4fbb56e8c188ab66f82f1e71d39 540 539 2008-05-31T06:27:44Z wikipedia>Patrick 0 {{{imageclass|}}}, to be used with [[Template:Image class]] wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}" {{{imageclass|}}}> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 2172af443be3cd55643ed88aa35d551edf22fb62 541 540 2008-05-31T06:48:59Z wikipedia>Patrick 0 for uniformity: class="{{{imageclass|}}}" wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 5ec8b6aaef112369f2cee067f6f61b28c5893e50 542 541 2008-08-14T21:31:00Z wikipedia>Happy-melon 0 change fontsize per editprotected wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 90%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> db8d00ff7a357b757d3ba9c6c1d0de03222230db 543 542 2008-08-14T23:55:13Z wikipedia>Edokter 0 [[WP:UNDO|Undid]] revision 231980160 by [[Special:Contributions/Happy-melon|Happy-melon]] ([[User talk:Happy-melon|talk]]) Revert, change is opposed on talk. wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 5ec8b6aaef112369f2cee067f6f61b28c5893e50 544 543 2008-11-01T00:36:24Z wikipedia>Master of Puppets 0 fixing, thanks Izno! wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 52ceaab347482f85872d7c0139d2245a8c4814eb 545 544 2008-11-10T01:58:15Z wikipedia>Elonka 0 Updating per talkpage request wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; border-spacing: 5px {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader -->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 7a2c737fcd3643e64e7ec02f064ae6269d9ca74f 546 545 2008-11-10T04:17:44Z wikipedia>Elonka 0 updating from sandbox per request wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader -->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 66420995bad976041764ce8e43fc1fd0444e1111 547 546 2008-11-23T17:45:47Z wikipedia>MZMcBride 0 minor code edit wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader -->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Tnavbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> a1020bfb400002b1555a8d581ae7602b01d81b89 548 547 2009-05-25T09:32:19Z wikipedia>Dinoguy1000 0 Tnavbar --> Navbar wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader -->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!-- Image -->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!-- Row 1 -->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!-- Row 2 -->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!-- Row 3 -->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!-- Row 4 -->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!-- Row 5 -->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!-- Row 6 -->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!-- Row 7 -->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!-- Row 8 -->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!-- Row 9 -->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!-- Row 10 -->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!-- Row 11 -->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!-- Row 12 -->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!-- Row 13 -->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!-- Row 14 -->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!-- Row 15 -->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!-- Row 16 -->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!-- Row 17 -->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!-- Row 18 -->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!-- Row 19 -->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!-- Row 20 -->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!-- Row 21 -->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!-- Row 22 -->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!-- Row 23 -->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!-- Row 24 -->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!-- Row 25 -->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!-- Row 26 -->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!-- Row 27 -->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!-- Row 28 -->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!-- Row 29 -->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!-- Row 30 -->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!-- Row 31 -->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!-- Row 32 -->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!-- Row 33 -->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!-- Row 34 -->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!-- Row 35 -->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!-- Row 36 -->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!-- Row 37 -->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!-- Row 38 -->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!-- Row 39 -->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!-- Row 40 -->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!-- Row 41 -->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!-- Row 42 -->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!-- Row 43 -->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!-- Row 44 -->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!-- Row 45 -->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!-- Row 46 -->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!-- Row 47 -->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!-- Row 48 -->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!-- Row 49 -->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!-- Row 50 -->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!-- Row 51 -->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!-- Row 52 -->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!-- Row 53 -->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!-- Row 54 -->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!-- Row 55 -->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!-- Row 56 -->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!-- Row 57 -->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!-- Row 58 -->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!-- Row 59 -->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!-- Row 60 -->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!-- Row 61 -->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!-- Row 62 -->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!-- Row 63 -->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!-- Row 64 -->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!-- Row 65 -->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!-- Row 66 -->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!-- Row 67 -->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!-- Row 68 -->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!-- Row 69 -->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!-- Row 70 -->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!-- Row 71 -->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!-- Row 72 -->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!-- Row 73 -->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!-- Row 74 -->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!-- Row 75 -->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!-- Row 76 -->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!-- Row 77 -->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!-- Row 78 -->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!-- Row 79 -->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!-- Row 80 -->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 2c0c8b3180ac568f15a26aadf895cb5f6adacd79 549 548 2009-06-02T17:39:22Z wikipedia>MSGJ 0 code rework, and support two additional parameters, per talk page discussion wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader 1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1|}}}}}}</td></tr>}}<!-- Subheader 2 -->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!-- Image 1 -->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image|{{{image1|}}}}}} {{#if:{{{caption|{{{caption1|}}}}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption|{{{caption1|}}}}}}</span> }}</td></tr>}}<!-- Image 2 -->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image2}}} {{#if:{{{caption2|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption2}}}</span> }}</td></tr>}}<!-- -->{{Infobox/row |header = {{{header1|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label1|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data1|}}} |datastyle = {{{datastyle|}}} |class = {{{class1|}}} }} {{Infobox/row |header = {{{header2|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label2|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data2|}}} |datastyle = {{{datastyle|}}} |class = {{{class2|}}} }} {{Infobox/row |header = {{{header3|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label3|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data3|}}} |datastyle = {{{datastyle|}}} |class = {{{class3|}}} }} {{Infobox/row |header = {{{header4|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label4|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data4|}}} |datastyle = {{{datastyle|}}} |class = {{{class4|}}} }} {{Infobox/row |header = {{{header5|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label5|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data5|}}} |datastyle = {{{datastyle|}}} |class = {{{class5|}}} }} {{Infobox/row |header = {{{header6|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label6|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data6|}}} |datastyle = {{{datastyle|}}} |class = {{{class6|}}} }} {{Infobox/row |header = {{{header7|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label7|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data7|}}} |datastyle = {{{datastyle|}}} |class = {{{class7|}}} }} {{Infobox/row |header = {{{header8|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label8|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data8|}}} |datastyle = {{{datastyle|}}} |class = {{{class8|}}} }} {{Infobox/row |header = {{{header9|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label9|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data9|}}} |datastyle = {{{datastyle|}}} |class = {{{class9|}}} }} {{Infobox/row |header = {{{header10|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label10|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data10|}}} |datastyle = {{{datastyle|}}} |class = {{{class10|}}} }} {{Infobox/row |header = {{{header11|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label11|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data11|}}} |datastyle = {{{datastyle|}}} |class = {{{class11|}}} }} {{Infobox/row |header = {{{header12|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label12|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data12|}}} |datastyle = {{{datastyle|}}} |class = {{{class12|}}} }} {{Infobox/row |header = {{{header13|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label13|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data13|}}} |datastyle = {{{datastyle|}}} |class = {{{class13|}}} }} {{Infobox/row |header = {{{header14|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label14|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data14|}}} |datastyle = {{{datastyle|}}} |class = {{{class14|}}} }} {{Infobox/row |header = {{{header15|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label15|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data15|}}} |datastyle = {{{datastyle|}}} |class = {{{class15|}}} }} {{Infobox/row |header = {{{header16|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label16|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data16|}}} |datastyle = {{{datastyle|}}} |class = {{{class16|}}} }} {{Infobox/row |header = {{{header17|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label17|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data17|}}} |datastyle = {{{datastyle|}}} |class = {{{class17|}}} }} {{Infobox/row |header = {{{header18|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label18|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data18|}}} |datastyle = {{{datastyle|}}} |class = {{{class18|}}} }} {{Infobox/row |header = {{{header19|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label19|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data19|}}} |datastyle = {{{datastyle|}}} |class = {{{class19|}}} }} {{Infobox/row |header = {{{header20|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label20|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data20|}}} |datastyle = {{{datastyle|}}} |class = {{{class20|}}} }} {{Infobox/row |header = {{{header21|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label21|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data21|}}} |datastyle = {{{datastyle|}}} |class = {{{class21|}}} }} {{Infobox/row |header = {{{header22|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label22|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data22|}}} |datastyle = {{{datastyle|}}} |class = {{{class22|}}} }} {{Infobox/row |header = {{{header23|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label23|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data23|}}} |datastyle = {{{datastyle|}}} |class = {{{class23|}}} }} {{Infobox/row |header = {{{header24|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label24|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data24|}}} |datastyle = {{{datastyle|}}} |class = {{{class24|}}} }} {{Infobox/row |header = {{{header25|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label25|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data25|}}} |datastyle = {{{datastyle|}}} |class = {{{class25|}}} }} {{Infobox/row |header = {{{header26|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label26|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data26|}}} |datastyle = {{{datastyle|}}} |class = {{{class26|}}} }} {{Infobox/row |header = {{{header27|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label27|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data27|}}} |datastyle = {{{datastyle|}}} |class = {{{class27|}}} }} {{Infobox/row |header = {{{header28|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label28|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data28|}}} |datastyle = {{{datastyle|}}} |class = {{{class28|}}} }} {{Infobox/row |header = {{{header29|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label29|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data29|}}} |datastyle = {{{datastyle|}}} |class = {{{class29|}}} }} {{Infobox/row |header = {{{header30|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label30|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data30|}}} |datastyle = {{{datastyle|}}} |class = {{{class30|}}} }} {{Infobox/row |header = {{{header31|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label31|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data31|}}} |datastyle = {{{datastyle|}}} |class = {{{class31|}}} }} {{Infobox/row |header = {{{header32|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label32|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data32|}}} |datastyle = {{{datastyle|}}} |class = {{{class32|}}} }} {{Infobox/row |header = {{{header33|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label33|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data33|}}} |datastyle = {{{datastyle|}}} |class = {{{class33|}}} }} {{Infobox/row |header = {{{header34|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label34|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data34|}}} |datastyle = {{{datastyle|}}} |class = {{{class34|}}} }} {{Infobox/row |header = {{{header35|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label35|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data35|}}} |datastyle = {{{datastyle|}}} |class = {{{class35|}}} }} {{Infobox/row |header = {{{header36|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label36|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data36|}}} |datastyle = {{{datastyle|}}} |class = {{{class36|}}} }} {{Infobox/row |header = {{{header37|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label37|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data37|}}} |datastyle = {{{datastyle|}}} |class = {{{class37|}}} }} {{Infobox/row |header = {{{header38|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label38|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data38|}}} |datastyle = {{{datastyle|}}} |class = {{{class38|}}} }} {{Infobox/row |header = {{{header39|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label39|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data39|}}} |datastyle = {{{datastyle|}}} |class = {{{class39|}}} }} {{Infobox/row |header = {{{header40|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label40|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data40|}}} |datastyle = {{{datastyle|}}} |class = {{{class40|}}} }} {{Infobox/row |header = {{{header41|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label41|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data41|}}} |datastyle = {{{datastyle|}}} |class = {{{class41|}}} }} {{Infobox/row |header = {{{header42|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label42|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data42|}}} |datastyle = {{{datastyle|}}} |class = {{{class42|}}} }} {{Infobox/row |header = {{{header43|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label43|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data43|}}} |datastyle = {{{datastyle|}}} |class = {{{class43|}}} }} {{Infobox/row |header = {{{header44|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label44|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data44|}}} |datastyle = {{{datastyle|}}} |class = {{{class44|}}} }} {{Infobox/row |header = {{{header45|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label45|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data45|}}} |datastyle = {{{datastyle|}}} |class = {{{class45|}}} }} {{Infobox/row |header = {{{header46|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label46|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data46|}}} |datastyle = {{{datastyle|}}} |class = {{{class46|}}} }} {{Infobox/row |header = {{{header47|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label47|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data47|}}} |datastyle = {{{datastyle|}}} |class = {{{class47|}}} }} {{Infobox/row |header = {{{header48|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label48|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data48|}}} |datastyle = {{{datastyle|}}} |class = {{{class48|}}} }} {{Infobox/row |header = {{{header49|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label49|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data49|}}} |datastyle = {{{datastyle|}}} |class = {{{class49|}}} }} {{Infobox/row |header = {{{header50|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label50|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data50|}}} |datastyle = {{{datastyle|}}} |class = {{{class50|}}} }} {{Infobox/row |header = {{{header51|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label51|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data51|}}} |datastyle = {{{datastyle|}}} |class = {{{class51|}}} }} {{Infobox/row |header = {{{header52|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label52|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data52|}}} |datastyle = {{{datastyle|}}} |class = {{{class52|}}} }} {{Infobox/row |header = {{{header53|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label53|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data53|}}} |datastyle = {{{datastyle|}}} |class = {{{class53|}}} }} {{Infobox/row |header = {{{header54|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label54|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data54|}}} |datastyle = {{{datastyle|}}} |class = {{{class54|}}} }} {{Infobox/row |header = {{{header55|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label55|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data55|}}} |datastyle = {{{datastyle|}}} |class = {{{class55|}}} }} {{Infobox/row |header = {{{header56|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label56|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data56|}}} |datastyle = {{{datastyle|}}} |class = {{{class56|}}} }} {{Infobox/row |header = {{{header57|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label57|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data57|}}} |datastyle = {{{datastyle|}}} |class = {{{class57|}}} }} {{Infobox/row |header = {{{header58|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label58|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data58|}}} |datastyle = {{{datastyle|}}} |class = {{{class58|}}} }} {{Infobox/row |header = {{{header59|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label59|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data59|}}} |datastyle = {{{datastyle|}}} |class = {{{class59|}}} }} {{Infobox/row |header = {{{header60|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label60|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data60|}}} |datastyle = {{{datastyle|}}} |class = {{{class60|}}} }} {{Infobox/row |header = {{{header61|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label61|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data61|}}} |datastyle = {{{datastyle|}}} |class = {{{class61|}}} }} {{Infobox/row |header = {{{header62|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label62|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data62|}}} |datastyle = {{{datastyle|}}} |class = {{{class62|}}} }} {{Infobox/row |header = {{{header63|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label63|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data63|}}} |datastyle = {{{datastyle|}}} |class = {{{class63|}}} }} {{Infobox/row |header = {{{header64|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label64|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data64|}}} |datastyle = {{{datastyle|}}} |class = {{{class64|}}} }} {{Infobox/row |header = {{{header65|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label65|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data65|}}} |datastyle = {{{datastyle|}}} |class = {{{class65|}}} }} {{Infobox/row |header = {{{header66|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label66|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data66|}}} |datastyle = {{{datastyle|}}} |class = {{{class66|}}} }} {{Infobox/row |header = {{{header67|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label67|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data67|}}} |datastyle = {{{datastyle|}}} |class = {{{class67|}}} }} {{Infobox/row |header = {{{header68|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label68|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data68|}}} |datastyle = {{{datastyle|}}} |class = {{{class68|}}} }} {{Infobox/row |header = {{{header69|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label69|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data69|}}} |datastyle = {{{datastyle|}}} |class = {{{class69|}}} }} {{Infobox/row |header = {{{header70|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label70|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data70|}}} |datastyle = {{{datastyle|}}} |class = {{{class70|}}} }} {{Infobox/row |header = {{{header71|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label71|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data71|}}} |datastyle = {{{datastyle|}}} |class = {{{class71|}}} }} {{Infobox/row |header = {{{header72|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label72|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data72|}}} |datastyle = {{{datastyle|}}} |class = {{{class72|}}} }} {{Infobox/row |header = {{{header73|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label73|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data73|}}} |datastyle = {{{datastyle|}}} |class = {{{class73|}}} }} {{Infobox/row |header = {{{header74|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label74|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data74|}}} |datastyle = {{{datastyle|}}} |class = {{{class74|}}} }} {{Infobox/row |header = {{{header75|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label75|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data75|}}} |datastyle = {{{datastyle|}}} |class = {{{class75|}}} }} {{Infobox/row |header = {{{header76|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label76|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data76|}}} |datastyle = {{{datastyle|}}} |class = {{{class76|}}} }} {{Infobox/row |header = {{{header77|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label77|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data77|}}} |datastyle = {{{datastyle|}}} |class = {{{class77|}}} }} {{Infobox/row |header = {{{header78|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label78|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data78|}}} |datastyle = {{{datastyle|}}} |class = {{{class78|}}} }} {{Infobox/row |header = {{{header79|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label79|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data79|}}} |datastyle = {{{datastyle|}}} |class = {{{class79|}}} }} {{Infobox/row |header = {{{header80|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label80|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data80|}}} |datastyle = {{{datastyle|}}} |class = {{{class80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table> <noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> 128c3d588df67241eff6898d9aeb555187f74052 550 549 2009-06-02T19:01:38Z wikipedia>Mattbr 0 moved noinclude up a line to prevent excess whitespace wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}} <!-- Header -->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!-- Subheader 1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1|}}}}}}</td></tr>}}<!-- Subheader 2 -->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!-- Image 1 -->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image|{{{image1|}}}}}} {{#if:{{{caption|{{{caption1|}}}}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption|{{{caption1|}}}}}}</span> }}</td></tr>}}<!-- Image 2 -->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image2}}} {{#if:{{{caption2|}}}|<br /> <span style="{{{captionstyle|}}}">{{{caption2}}}</span> }}</td></tr>}}<!-- -->{{Infobox/row |header = {{{header1|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label1|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data1|}}} |datastyle = {{{datastyle|}}} |class = {{{class1|}}} }} {{Infobox/row |header = {{{header2|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label2|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data2|}}} |datastyle = {{{datastyle|}}} |class = {{{class2|}}} }} {{Infobox/row |header = {{{header3|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label3|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data3|}}} |datastyle = {{{datastyle|}}} |class = {{{class3|}}} }} {{Infobox/row |header = {{{header4|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label4|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data4|}}} |datastyle = {{{datastyle|}}} |class = {{{class4|}}} }} {{Infobox/row |header = {{{header5|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label5|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data5|}}} |datastyle = {{{datastyle|}}} |class = {{{class5|}}} }} {{Infobox/row |header = {{{header6|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label6|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data6|}}} |datastyle = {{{datastyle|}}} |class = {{{class6|}}} }} {{Infobox/row |header = {{{header7|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label7|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data7|}}} |datastyle = {{{datastyle|}}} |class = {{{class7|}}} }} {{Infobox/row |header = {{{header8|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label8|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data8|}}} |datastyle = {{{datastyle|}}} |class = {{{class8|}}} }} {{Infobox/row |header = {{{header9|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label9|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data9|}}} |datastyle = {{{datastyle|}}} |class = {{{class9|}}} }} {{Infobox/row |header = {{{header10|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label10|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data10|}}} |datastyle = {{{datastyle|}}} |class = {{{class10|}}} }} {{Infobox/row |header = {{{header11|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label11|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data11|}}} |datastyle = {{{datastyle|}}} |class = {{{class11|}}} }} {{Infobox/row |header = {{{header12|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label12|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data12|}}} |datastyle = {{{datastyle|}}} |class = {{{class12|}}} }} {{Infobox/row |header = {{{header13|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label13|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data13|}}} |datastyle = {{{datastyle|}}} |class = {{{class13|}}} }} {{Infobox/row |header = {{{header14|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label14|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data14|}}} |datastyle = {{{datastyle|}}} |class = {{{class14|}}} }} {{Infobox/row |header = {{{header15|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label15|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data15|}}} |datastyle = {{{datastyle|}}} |class = {{{class15|}}} }} {{Infobox/row |header = {{{header16|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label16|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data16|}}} |datastyle = {{{datastyle|}}} |class = {{{class16|}}} }} {{Infobox/row |header = {{{header17|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label17|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data17|}}} |datastyle = {{{datastyle|}}} |class = {{{class17|}}} }} {{Infobox/row |header = {{{header18|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label18|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data18|}}} |datastyle = {{{datastyle|}}} |class = {{{class18|}}} }} {{Infobox/row |header = {{{header19|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label19|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data19|}}} |datastyle = {{{datastyle|}}} |class = {{{class19|}}} }} {{Infobox/row |header = {{{header20|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label20|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data20|}}} |datastyle = {{{datastyle|}}} |class = {{{class20|}}} }} {{Infobox/row |header = {{{header21|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label21|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data21|}}} |datastyle = {{{datastyle|}}} |class = {{{class21|}}} }} {{Infobox/row |header = {{{header22|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label22|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data22|}}} |datastyle = {{{datastyle|}}} |class = {{{class22|}}} }} {{Infobox/row |header = {{{header23|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label23|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data23|}}} |datastyle = {{{datastyle|}}} |class = {{{class23|}}} }} {{Infobox/row |header = {{{header24|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label24|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data24|}}} |datastyle = {{{datastyle|}}} |class = {{{class24|}}} }} {{Infobox/row |header = {{{header25|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label25|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data25|}}} |datastyle = {{{datastyle|}}} |class = {{{class25|}}} }} {{Infobox/row |header = {{{header26|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label26|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data26|}}} |datastyle = {{{datastyle|}}} |class = {{{class26|}}} }} {{Infobox/row |header = {{{header27|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label27|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data27|}}} |datastyle = {{{datastyle|}}} |class = {{{class27|}}} }} {{Infobox/row |header = {{{header28|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label28|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data28|}}} |datastyle = {{{datastyle|}}} |class = {{{class28|}}} }} {{Infobox/row |header = {{{header29|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label29|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data29|}}} |datastyle = {{{datastyle|}}} |class = {{{class29|}}} }} {{Infobox/row |header = {{{header30|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label30|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data30|}}} |datastyle = {{{datastyle|}}} |class = {{{class30|}}} }} {{Infobox/row |header = {{{header31|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label31|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data31|}}} |datastyle = {{{datastyle|}}} |class = {{{class31|}}} }} {{Infobox/row |header = {{{header32|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label32|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data32|}}} |datastyle = {{{datastyle|}}} |class = {{{class32|}}} }} {{Infobox/row |header = {{{header33|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label33|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data33|}}} |datastyle = {{{datastyle|}}} |class = {{{class33|}}} }} {{Infobox/row |header = {{{header34|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label34|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data34|}}} |datastyle = {{{datastyle|}}} |class = {{{class34|}}} }} {{Infobox/row |header = {{{header35|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label35|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data35|}}} |datastyle = {{{datastyle|}}} |class = {{{class35|}}} }} {{Infobox/row |header = {{{header36|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label36|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data36|}}} |datastyle = {{{datastyle|}}} |class = {{{class36|}}} }} {{Infobox/row |header = {{{header37|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label37|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data37|}}} |datastyle = {{{datastyle|}}} |class = {{{class37|}}} }} {{Infobox/row |header = {{{header38|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label38|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data38|}}} |datastyle = {{{datastyle|}}} |class = {{{class38|}}} }} {{Infobox/row |header = {{{header39|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label39|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data39|}}} |datastyle = {{{datastyle|}}} |class = {{{class39|}}} }} {{Infobox/row |header = {{{header40|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label40|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data40|}}} |datastyle = {{{datastyle|}}} |class = {{{class40|}}} }} {{Infobox/row |header = {{{header41|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label41|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data41|}}} |datastyle = {{{datastyle|}}} |class = {{{class41|}}} }} {{Infobox/row |header = {{{header42|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label42|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data42|}}} |datastyle = {{{datastyle|}}} |class = {{{class42|}}} }} {{Infobox/row |header = {{{header43|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label43|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data43|}}} |datastyle = {{{datastyle|}}} |class = {{{class43|}}} }} {{Infobox/row |header = {{{header44|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label44|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data44|}}} |datastyle = {{{datastyle|}}} |class = {{{class44|}}} }} {{Infobox/row |header = {{{header45|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label45|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data45|}}} |datastyle = {{{datastyle|}}} |class = {{{class45|}}} }} {{Infobox/row |header = {{{header46|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label46|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data46|}}} |datastyle = {{{datastyle|}}} |class = {{{class46|}}} }} {{Infobox/row |header = {{{header47|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label47|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data47|}}} |datastyle = {{{datastyle|}}} |class = {{{class47|}}} }} {{Infobox/row |header = {{{header48|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label48|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data48|}}} |datastyle = {{{datastyle|}}} |class = {{{class48|}}} }} {{Infobox/row |header = {{{header49|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label49|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data49|}}} |datastyle = {{{datastyle|}}} |class = {{{class49|}}} }} {{Infobox/row |header = {{{header50|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label50|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data50|}}} |datastyle = {{{datastyle|}}} |class = {{{class50|}}} }} {{Infobox/row |header = {{{header51|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label51|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data51|}}} |datastyle = {{{datastyle|}}} |class = {{{class51|}}} }} {{Infobox/row |header = {{{header52|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label52|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data52|}}} |datastyle = {{{datastyle|}}} |class = {{{class52|}}} }} {{Infobox/row |header = {{{header53|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label53|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data53|}}} |datastyle = {{{datastyle|}}} |class = {{{class53|}}} }} {{Infobox/row |header = {{{header54|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label54|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data54|}}} |datastyle = {{{datastyle|}}} |class = {{{class54|}}} }} {{Infobox/row |header = {{{header55|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label55|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data55|}}} |datastyle = {{{datastyle|}}} |class = {{{class55|}}} }} {{Infobox/row |header = {{{header56|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label56|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data56|}}} |datastyle = {{{datastyle|}}} |class = {{{class56|}}} }} {{Infobox/row |header = {{{header57|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label57|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data57|}}} |datastyle = {{{datastyle|}}} |class = {{{class57|}}} }} {{Infobox/row |header = {{{header58|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label58|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data58|}}} |datastyle = {{{datastyle|}}} |class = {{{class58|}}} }} {{Infobox/row |header = {{{header59|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label59|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data59|}}} |datastyle = {{{datastyle|}}} |class = {{{class59|}}} }} {{Infobox/row |header = {{{header60|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label60|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data60|}}} |datastyle = {{{datastyle|}}} |class = {{{class60|}}} }} {{Infobox/row |header = {{{header61|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label61|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data61|}}} |datastyle = {{{datastyle|}}} |class = {{{class61|}}} }} {{Infobox/row |header = {{{header62|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label62|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data62|}}} |datastyle = {{{datastyle|}}} |class = {{{class62|}}} }} {{Infobox/row |header = {{{header63|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label63|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data63|}}} |datastyle = {{{datastyle|}}} |class = {{{class63|}}} }} {{Infobox/row |header = {{{header64|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label64|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data64|}}} |datastyle = {{{datastyle|}}} |class = {{{class64|}}} }} {{Infobox/row |header = {{{header65|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label65|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data65|}}} |datastyle = {{{datastyle|}}} |class = {{{class65|}}} }} {{Infobox/row |header = {{{header66|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label66|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data66|}}} |datastyle = {{{datastyle|}}} |class = {{{class66|}}} }} {{Infobox/row |header = {{{header67|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label67|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data67|}}} |datastyle = {{{datastyle|}}} |class = {{{class67|}}} }} {{Infobox/row |header = {{{header68|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label68|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data68|}}} |datastyle = {{{datastyle|}}} |class = {{{class68|}}} }} {{Infobox/row |header = {{{header69|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label69|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data69|}}} |datastyle = {{{datastyle|}}} |class = {{{class69|}}} }} {{Infobox/row |header = {{{header70|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label70|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data70|}}} |datastyle = {{{datastyle|}}} |class = {{{class70|}}} }} {{Infobox/row |header = {{{header71|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label71|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data71|}}} |datastyle = {{{datastyle|}}} |class = {{{class71|}}} }} {{Infobox/row |header = {{{header72|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label72|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data72|}}} |datastyle = {{{datastyle|}}} |class = {{{class72|}}} }} {{Infobox/row |header = {{{header73|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label73|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data73|}}} |datastyle = {{{datastyle|}}} |class = {{{class73|}}} }} {{Infobox/row |header = {{{header74|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label74|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data74|}}} |datastyle = {{{datastyle|}}} |class = {{{class74|}}} }} {{Infobox/row |header = {{{header75|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label75|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data75|}}} |datastyle = {{{datastyle|}}} |class = {{{class75|}}} }} {{Infobox/row |header = {{{header76|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label76|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data76|}}} |datastyle = {{{datastyle|}}} |class = {{{class76|}}} }} {{Infobox/row |header = {{{header77|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label77|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data77|}}} |datastyle = {{{datastyle|}}} |class = {{{class77|}}} }} {{Infobox/row |header = {{{header78|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label78|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data78|}}} |datastyle = {{{datastyle|}}} |class = {{{class78|}}} }} {{Infobox/row |header = {{{header79|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label79|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data79|}}} |datastyle = {{{datastyle|}}} |class = {{{class79|}}} }} {{Infobox/row |header = {{{header80|}}} |headerstyle = {{{headerstyle|}}} |label = {{{label80|}}} |labelstyle = {{{labelstyle|}}} |data = {{{data80|}}} |datastyle = {{{datastyle|}}} |class = {{{class80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> 50bef955e13add2ea4342b878ac7d33b54b6440b 551 550 2009-09-06T15:57:54Z wikipedia>MSGJ 0 pass rowclass parameters to /row wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1}}}}}}</td></tr>}}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image|{{{image1}}}}}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}</td></tr>}}<!-- Image2 -->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}</td></tr>}}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> da226644840682da443d8048b08785c4569ac479 552 551 2009-09-21T23:29:21Z wikipedia>RockMFR 0 fix row 5 datastyle wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1}}}}}}</td></tr>}}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image|{{{image1}}}}}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}</td></tr>}}<!-- Image2 -->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}</td></tr>}}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> a119b1ef2bd768544ff618034bafaa41e790378f 553 552 2009-12-04T15:29:12Z wikipedia>TheDJ 0 headers -> infobox/row wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above|}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader|}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2|}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2|}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2|}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> 5ac4f0eb4294d130e02d68fe06e508e4adb92c65 554 553 2009-12-16T13:31:39Z wikipedia>Edokter 0 remove double evaluations wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}} </table><noinclude> {{pp-template|small=yes}} {{documentation}} </noinclude> b93083a136ecd915285600e7f51271de0b669a84 555 554 2010-03-08T16:54:10Z wikipedia>MSGJ 0 trying the mini version of the navbar per discussion, revert at will wikitext text/x-wiki <table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} </table><noinclude> {{documentation}} </noinclude> 4dc21297ecf9847ac5eb724a07d0b17e08617a72 556 555 2010-06-05T19:42:33Z wikipedia>Plastikspork 0 Add option to embed this infobox into another infobox (should not cause any problems with current transclusions), please revert if controversial. Thanks! wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> d3a158a4d2cad30c18fdad878c0d72af987f58b3 557 556 2010-06-06T17:09:22Z wikipedia>BrownHairedGirl 0 add Image3 wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> 6c1977fcda711d55d6ce427eed6f8289ddb0a846 558 557 2010-06-06T18:28:42Z wikipedia>MSGJ 0 undo: adding parameters to a highly used meta-template should probably be discussed, the second image was only added after much debate wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> d3a158a4d2cad30c18fdad878c0d72af987f58b3 559 558 2010-06-09T00:44:23Z wikipedia>Dinoguy1000 0 add {{{aboveimage}}}, to insert an image directly above {{{above}}} wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Aboveimage -->{{#if:{{{aboveimage|}}}|{{Infobox/row |data={{{aboveimage|}}}{{#if:{{{abovecaption|}}}|<br /><span style="{{{captionstyle|}}}">{{{abovecaption|}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{aboveimagerowclass|}}} }} }}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> ec463fd70c3052e4805b16d135ba05fb6126878e 560 559 2010-06-09T11:57:43Z wikipedia>MSGJ 0 Undid revision 366904503 by [[Special:Contributions/Dinoguy1000|Dinoguy1000]] ([[User talk:Dinoguy1000|talk]]) - pending discussion wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|}}}|{{Infobox/row |data={{{subheader}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> d3a158a4d2cad30c18fdad878c0d72af987f58b3 561 560 2010-06-30T03:57:05Z wikipedia>Plastikspork 0 Per editrequest on talk page wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}<noinclude> {{documentation}} </noinclude> a4dab593db2c052fb784071fdd72cbec364d42b2 562 561 2010-11-26T10:00:24Z wikipedia>MSGJ 0 add support for italic titles, per discussion wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<noinclude> {{documentation}} </noinclude> f475ad7bdc1cab9faa7b9a228cf0d166ed1decb7 Template:Template other 10 16 651 2009-02-06T04:14:11Z wikipedia>Davidgothberg 0 Creating this namespace detecting template. Based on my code from {{category other}} and {{main other}} etc. wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|Template | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 66415bf16ce29f975c7f303c234b6128cbfb1fd0 652 651 2009-02-06T04:17:26Z wikipedia>Davidgothberg 0 Protected Template:Template other: [[WP:HRT|Highly visible template]]:&#32;Will be used in for instance {{dmbox}} used in all disambig boxes, thus very high-risk. ([edit=sysop] (indefinite) [move=sysop] (indefinite)) wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|Template | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{pp-template|small=yes}} {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 66415bf16ce29f975c7f303c234b6128cbfb1fd0 653 652 2009-03-13T02:58:02Z wikipedia>Davidgothberg 0 Changing "Template" to "{{ns:Template}}". Thus slightly easier to port to other projects. wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{pp-template}} {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> a3af91e9292a2caf71db77265e34041943c60a41 654 653 2010-10-04T14:47:12Z wikipedia>WOSlinker 0 remove {{pp-template}} wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 06fb13d264df967b5232141067eb7d2b67372d76 Template:Ambox 10 18 721 720 2011-02-24T17:13:21Z wikipedia>MSGJ 0 pass date to /core for display after text wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{{date|}}} }} }}{{cat handler |main={{#if:{{{cat|}}} |{{#if:{{{date|}}} |[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}| |[[Category:Articles with invalid date parameter in template]] }} |[[Category:{{#if:{{{undated|}}} |{{{undated}}} |{{{cat}}} }}]] }} }}{{#if:{{{all|}}} |[[Category:{{{all}}}]] }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 6d510307ae017b68828b11de98c5bdbef38a46ee 722 721 2011-02-28T17:35:44Z wikipedia>MSGJ 0 display current date on template version, to demonstrate wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} {{{date|}}} }} }} }}{{cat handler |main={{#if:{{{cat|}}} |{{#if:{{{date|}}} |[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}| |[[Category:Articles with invalid date parameter in template]] }} |[[Category:{{#if:{{{undated|}}} |{{{undated}}} |{{{cat}}} }}]] }} }}{{#if:{{{all|}}} |[[Category:{{{all}}}]] }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 518c27c409e56919a56f4c94c6e36657f3b04fed 723 722 2011-03-01T09:51:26Z wikipedia>MSGJ 0 fix my mistake wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{#if:{{{cat|}}} |{{#if:{{{date|}}} |[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}| |[[Category:Articles with invalid date parameter in template]] }} |[[Category:{{#if:{{{undated|}}} |{{{undated}}} |{{{cat}}} }}]] }} }}{{#if:{{{all|}}} |[[Category:{{{all}}}]] }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 481d06a0f6c401c23611c4e23c68b689a86b1cb1 724 723 2011-03-04T15:34:35Z wikipedia>MSGJ 0 move category code to subtemplate and remove undated wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{documentation}}<!-- Transclude documentation on template page --> }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> d5a89dbeb9e03aa9971d3b032e07ee53a569af2d 725 724 2011-03-15T15:24:52Z wikipedia>MSGJ 0 do not transclude doc if doc=no, to prevent template loops wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 29478ffbcac10fa8f0ac299bd447372ca858617b 726 725 2011-04-14T21:53:33Z wikipedia>Rich Farmbrough 0 wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 40eb863487e31b69d946fc21a067a30fe6ef0ece 727 726 2011-08-20T21:36:50Z wikipedia>Sandstein 0 code by [[User:This, that and the other]] to add a unique HTML ID to all article maintenance tags, per ta wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 5e1e95b4b72ab5a35eb8fbaddf769cdf92407354 728 727 2011-08-20T22:31:50Z wikipedia>Edokter 0 fix nested indent wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 6207942886b7724660bf3f295fd8202779f5aa62 729 728 2011-08-31T16:18:35Z wikipedia>Rich Farmbrough 0 Override defaultsorts when categorising amboxes wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes|{{BASEPAGENAME}}]]}} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> fc673d0958b2697a287191f906f0352f2ea4b94f 730 729 2011-09-16T04:47:03Z wikipedia>Plastikspork 0 Add nocat option like [[template:tmbox]] wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{cat handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> bbd129577dbd07b66bcdea504d2f741d21afa317 731 730 2011-12-03T17:14:24Z wikipedia>Plastikspork 0 link wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{category handler |main={{ambox/category |cat={{{cat|{{{category|}}}}}} |date={{{date|}}} |all={{{all|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 0bcf6636f2011aa68b8abed05629d732036eab3e 732 731 2011-12-30T08:40:48Z wikipedia>Killiondude 0 from /sandbox per edit request wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |cat2={{{cat2|{{{category2|}}}}}} |all2={{{all2|}}} |cat3={{{cat3|{{{category3|}}}}}} |all3={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |{{Documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 45e770d580b2799d7e1da1e8e1e25fb9e6479958 733 732 2012-05-21T20:18:59Z wikipedia>MSGJ 0 +add tracking categorty wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |cat2={{{cat2|{{{category2|}}}}}} |all2={{{all2|}}} |cat3={{{cat3|{{{category3|}}}}}} |all3={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |[[Category:Article message boxes with automatically transcluded documentation]]{{Documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 0217633f5918a2a20ca5e317b4a4c2447178e9b9 734 733 2012-06-07T16:32:22Z wikipedia>MSGJ 0 more efficient code wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{doc}}}|no| |[[Category:Article message boxes with automatically transcluded documentation]]{{Documentation}}<!-- Transclude documentation on template page --> }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 885800603fe53499e51e662015fcde65d5ffef7f 735 734 2012-06-07T16:48:17Z wikipedia>MSGJ 0 do not automatically transclude documentation, per discussion wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}} |date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}} |{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |{{{date|}}} }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 70aa3afd409df2ef164ebfe76f0df98975cbb26a 736 735 2012-06-11T19:52:07Z wikipedia>MSGJ 0 add talk page link functionality, as proposed on talk page wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}}{{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = &#32;More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }}{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 198cd7a09f1bc8e4ae2d786faaae72a43de610ac 737 736 2012-06-16T08:40:22Z wikipedia>MSGJ 0 slight change to categorisation of ambox templates wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}}{{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = &#32;More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }}{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#ifeq:{{FULLPAGENAME}}|Template:{{{name}}} | [[Category:Article message templates]] |{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 5306be4b963ff6202e427a73efddbd588af6cb92 738 737 2012-06-17T13:17:21Z wikipedia>MSGJ 0 tweak categorisation, if {{{name}}} parameter defined then no category unless on Template:{{{name}}} wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{{text}}} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text}}}{{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = &#32;More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }}{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|}}} |{{FULLPAGENAME}} = [[Category:Article message templates]] |Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true | <!--Don't categorise--> | [[Category:Article message boxes|{{BASEPAGENAME}}]] }} }} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 48aa7ff93cc3f8ff234bad333b9f3c5569998f4f 739 738 2012-06-22T15:15:11Z wikipedia>MSGJ 0 implement separate parameters for issue and fix, use only issue in small form unless smalltext specified, adjust categories for article message templates wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{#if:{{{issue|}}} |{{{issue}}} |{{{text}}} }} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-in-submbox"> {{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = &#32;More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}} |{{FULLPAGENAME}} = [[Category:Article message templates]] |Template: = [[Category:Article message templates with missing parameters]] }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 690c9224fd2507d6c0af53d85668ccebd954f281 740 739 2012-06-26T11:59:39Z wikipedia>MSGJ 0 rename class, tweak categorisation wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{#if:{{{issue|}}} |{{{issue}}} |{{{text}}} }} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-when-compact"> {{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = &#32;More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }} }} }}{{Category handler |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}} |{{FULLPAGENAME}} = [[Category:Article message templates]] |Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> f36b54a7217958c89818d18f32b14ad5784ff119 741 740 2012-06-29T10:55:34Z wikipedia>MSGJ 0 only show talk page link if talk page exists, add info parameter for additional information, make nocat=true work, tracking category adjustments wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{#ifeq:{{{small}}}|left |{{Ambox/core |small = left |type = {{{type|}}} |image = {{#if:{{{smallimage|}}} |{{{smallimage}}} |{{{image|}}} }} |imageright = {{#if:{{{smallimageright|}}} |{{{smallimageright}}} |{{{imageright|}}} }} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{#if:{{{smalltext|}}} |{{{smalltext}}} |{{#if:{{{issue|}}} |{{{issue}}} |{{{text}}} }} }} }} |{{Ambox/core |type = {{{type|}}} |image = {{{image|}}} |imageright = {{{imageright|}}} |class = {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-when-compact"> {{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}} |#default = {{#ifexist:{{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |{{{talk}}} |{{TALKPAGENAME}} }} |&#32;More details and relevant discussion may be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}} |[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]] |the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]] }}. }} }} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|&#32;<small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}} |#default = &#32;<small>''({{{date}}})''</small> }}<span class="hide-when-compact"> {{{info|}}}</span> }} }}{{Category handler |nocat={{{nocat|}}} |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}} |{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}} |[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]] }}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}} |[[Category:Article message templates with missing parameters|C]] }} |Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 2055e4ab691c901093c80e8a3560edc6e815355b 742 741 2012-07-05T05:50:02Z wikipedia>MSGJ 0 major rewrite, splitting code for small ambox, add section parameter wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{Ambox/{{#ifeq:{{{small}}}|left|small|core}} |type = {{{type|}}} |image = {{{image|}}} |smallimage = {{#if:{{{smallimage|}}}|{{{smallimage}}}|{{{image|}}}}} |imageright = {{{imageright|}}} |smallimageright = {{#if:{{{smallimageright|}}}|{{{smallimageright}}}|{{{imageright|}}}}} |class = ambox-{{#switch:{{{type|}}} |speedy = speedy |delete = delete |content = content |style = style |move = move |protection = protection |notice|#default = notice }} {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |smalltext = {{{smalltext|}}} |talk = {{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|#}} |#default = {{{talk}}} }} |issue = {{#switch:{{{sect|¬}}} |¬ = <!-- No section parameter used --> | = This article |This {{{sect}}} }} {{{issue<includeonly>|</includeonly>}}} {{{text|}}} |fix = {{{fix<includeonly>|</includeonly>}}} |date = {{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |#default = {{{date}}} }} |info = {{{info|}}} }}{{Category handler |nocat={{{nocat|<noinclude>true</noinclude>}}} |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|}}} |{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}} |[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]] }}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}} |[[Category:Article message templates with missing parameters|C]] }} |Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> f641f604608e67e0fd6af2ff02712ad3dd5b9b83 Template:Infobox 10 11 563 562 2011-02-27T00:30:41Z wikipedia>Edokter 0 Moving inline CSS to common.css wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="{{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<noinclude> {{documentation}} </noinclude> 45929d6491c4bf3f1eee57391ea719fa343c30a2 564 563 2011-03-08T01:39:30Z wikipedia>Edokter 0 Moving widht back in, as it is template specific. wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|{{Infobox/row |header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}} |class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}} }} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<noinclude> {{documentation}} </noinclude> 032db1c39a8131209f22f22d4d380f1b1f4876db 565 564 2011-05-13T17:36:10Z wikipedia>Edokter 0 Above does not require infobox/row (sandbox tested) wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<noinclude> {{documentation}} </noinclude> 03caf610076f3f0620c255a544bd4c659d6012bc 566 565 2011-07-02T18:50:24Z wikipedia>Thumperward 0 deploying detection code for empty infoboxes. see talk for details wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}</includeonly><noinclude>{{documentation}}</noinclude> 65610ed31ea6c7d353856a101fa12e7b6a3a93ca 567 566 2011-07-02T18:57:58Z wikipedia>Thumperward 0 wrap in mainspace detection wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{ns0|{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}}}</includeonly><noinclude>{{documentation}}</noinclude> f8dccaf0866c0fe8bb3e1200155a55235e7c107e 568 567 2011-07-02T19:15:49Z wikipedia>Thumperward 0 add "decat" parameter to manually remove pages from cat where it's known that no rows are wanted wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{ns0|{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 44ae08c391e02bac7eb62bf21d83c0840adc2292 569 568 2011-07-02T19:43:42Z wikipedia>Thumperward 0 splitting to two different categories by namespacew wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{ns0|[[category:articles which use infobox templates with no data rows]]|[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> c51193c1ae6281a4693cc00bee3004a6743a60e6 570 569 2011-07-04T10:15:59Z wikipedia>Thumperward 0 use {{namespace detect}} rather than {{ns0}} to catch only articlespace and templatespace (which removes userspace / talk page drafts and other unwanted examples) wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]|template=[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 047da0f4e9d7909f95cf06c398de9c46c565bc63 571 570 2011-07-05T08:45:32Z wikipedia>Thumperward 0 rm template categorisation: not useful on top of the article cats wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> e72da1084f8705a74587394f7c448912c65c6844 572 571 2011-07-29T12:46:37Z wikipedia>Thumperward 0 add subheaderstyle[1,2] wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 5713b1e101127a7efaaf2c9bfac459d2ec817ac2 573 572 2012-03-11T11:42:43Z wikipedia>Thumperward 0 proper floating support wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> ef757ab298dd330ff990fb869c619e01498d3b00 574 573 2012-09-05T08:41:46Z wikipedia>Thumperward 0 expand to 99 rows wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 3fedc1c20325047399219baf617029eac4c69b3c 575 574 2012-09-06T11:27:19Z wikipedia>Thumperward 0 add row 90 wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> b3316246aeea1243a52dde8e7a1593dddf178cf0 576 575 2012-10-07T14:30:03Z wikipedia>Edokter 0 Update from sandbox; Add CSS 'border-spacing' to mirror obsolete 'cellspacing' HTML attribute; reduced spacing from 5 to 3px; remove undocumented float (conflicts with Common.css). wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> e55ecc133f658f3b1b9e439b66a027ee255b2df8 577 576 2013-02-06T12:40:53Z wikipedia>Thumperward 0 add an image3, which is beginning to be necessary wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass3|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 3781ca74a65bae8c025d9f3425ba46a7df9f266e 578 577 2013-03-01T11:54:31Z wikipedia>Thumperward 0 whitespace fix for {{{below}}} to enable wikibullets wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass3|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}"> {{{below}}} </td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 77069ab19b2095eca5223dee5be018512e57cff2 Module:Yesno 828 3 27 2013-02-28T10:40:21Z wikipedia>ATDT 0 Ported [[Template:Yesno]] to Lua Scribunto text/plain local p = {} function p.yesno( frame ) local retvals = { yes = "yes", no = "", ["¬"] = "" } local any = false for k,v in pairs( frame.args ) do any = true retvals[k] = v end val = frame.args[1] if (val == nil and not any) or val == '¬' then return retvals['¬'] end val = (val or ''):lower() if val == '' then return retvals['blank'] ~= nil and retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p bb4f2c269c41feec577d252c453a3e7223f18106 28 27 2013-03-03T05:57:17Z wikipedia>ATDT 0 Trim space Scribunto text/plain local p = {} function p.yesno( frame ) local retvals = { yes = "yes", no = "", ["¬"] = "" } local any = false for k,v in pairs( frame.args ) do any = true retvals[k] = v end val = frame.args[1] if (val == nil and not any) or val == '¬' then return retvals['¬'] end val = (val or ''):lower() val = val:match'^%s*(.*%S)' or '' if val == '' then return retvals['blank'] ~= nil and retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p 337e114a8fd3320314e5a6bf2df7cd22ce1b8779 29 28 2013-03-03T06:16:13Z wikipedia>ATDT 0 Add inline comments Scribunto text/plain local p = {} function p.yesno( frame ) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local any = false for k,v in pairs( frame.args ) do any = true retvals[k] = v end val = frame.args[1] -- According to the template docs, the input should be considered nil -- only when no params were provided. If any params at all were present, -- the value must be considered blank. A bit weird, if you ask me. if (val == nil and not any) or val == '¬' then return retvals['¬'] end val = (val or ''):lower() -- Coerce to blank if nil; make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] ~= nil and retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p 381e50ed469bc8bfcc28d07851a541b46d9dc732 Module:Infobox 828 10 293 2013-03-14T02:47:29Z wikipedia>Toohool 0 [[WP:AES|←]]Created page with '-- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t...' Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell.attr('colspan', 2) end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .css('width', '22em') .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() if args.title then root.wikitext("'''" .. args.title .. "'''") end end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p 7a6b5160cced539da2610752b89fdfe46d640091 294 293 2013-03-14T02:53:38Z wikipedia>Toohool 0 fix text alignment Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .css('width', '22em') .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() if args.title then root.wikitext("'''" .. args.title .. "'''") end end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p 82985c2a6a5ed055f0bec7061a4fd2ffad00eb9f 295 294 2013-03-14T02:56:05Z wikipedia>Toohool 0 fix linebreak Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .css('width', '22em') .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() if args.title then root.wikitext("'''" .. args.title .. "'''") end end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p 00323b47abe564461bc677cff5610bedff8c6318 296 295 2013-03-14T02:56:39Z wikipedia>Toohool 0 fix linebreak Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .css('width', '22em') .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() if args.title then root.wikitext("'''" .. args.title .. "'''") end end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p 76a4b2d06f982b206ea3106e0535ea20f48a16f1 Module:Navbar 828 8 237 2013-03-16T02:45:49Z wikipedia>Toohool 0 navbar code split from [[Module:Navbox]] Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) end function _navbar( args ) if not args[1] then local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: No name provided') return span end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName ); if title.namespace == 0 then title = mw.title.makeTitle( 'Template', pageName ); end end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return div end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d805ea8d13679bbae2f115e24f7f67b1da1d1c25 238 237 2013-03-16T02:47:20Z wikipedia>Toohool 0 return an html string instead of an htmlbuilder Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) end function _navbar( args ) if not args[1] then local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: No name provided') return span end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName ); if title.namespace == 0 then title = mw.title.makeTitle( 'Template', pageName ); end end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d21cf8b1b37ab12bea46c9acef03a66fe7dedeb1 239 238 2013-03-16T03:08:18Z wikipedia>Dragons flight 0 If the documentation is accurate, this will use the namespace part of pageName first and fallback to Template if one isn't present, which is what we want. Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) end function _navbar( args ) if not args[1] then local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: No name provided') return span end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName, 'Template' ); end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p 6a716e98c10ec11d37a5a74ee285b399020625e1 240 239 2013-03-16T03:19:29Z wikipedia>Dragons flight 0 match ought to be marginally faster Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function _navbar( args ) if not args[1] then local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: No name provided') return span end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName, 'Template' ); end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p 918a00bc6fd03758be110d0ae4c6570c0eb248a2 241 240 2013-03-19T00:58:05Z wikipedia>Dragons flight 0 Protected Module:Navbar: [[WP:High-risk templates|Highly visible template]]: Used on a significant number of pages, but also still in testing. ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function _navbar( args ) if not args[1] then local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: No name provided') return span end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName, 'Template' ); end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p 918a00bc6fd03758be110d0ae4c6570c0eb248a2 Module:Navbar 828 8 242 241 2013-03-23T05:13:17Z wikipedia>Toohool 0 return error for non-existent page Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function _navbar( args ) if not args[1] then return error('No name provided') end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName, 'Template' ); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d5a833c67380b4eaef5ada68360a4f32809ae6e0 243 242 2013-03-26T02:45:52Z wikipedia>Dragons flight 0 Changed protection level of Module:Navbar: [[WP:High-risk templates|Highly visible template or Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function _navbar( args ) if not args[1] then return error('No name provided') end local title; local pageName = trim(args[1]) if mw.ustring.sub(pageName, 1, 1) == ':' then title = mw.title.new( mw.ustring.sub(pageName, 2) ); else title = mw.title.new( pageName, 'Template' ); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d5a833c67380b4eaef5ada68360a4f32809ae6e0 244 243 2013-03-31T20:07:29Z wikipedia>Dragons flight 0 handle expensive parser function limit without killing the box Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function getTitle( pageName ) pageName = trim( pageName ); if mw.ustring.sub(pageName, 1, 1) == ':' then return mw.title.new( mw.ustring.sub(pageName, 2) ); else return mw.title.new( pageName, 'Template' ); end end function _navbar( args ) if not args[1] then return error('No name provided') end local good, title; good, title = pcall( getTitle, args[1] ); if not good then return error('Expensive parser function limit exceeded'); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p a4ce88b3a1c521accc1f2e2173df179a29023e0a 245 244 2013-04-02T05:53:01Z wikipedia>Dragons flight 0 also trap talk title Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function getTitle( pageName ) pageName = trim( pageName ); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); else page_title = mw.title.new( pageName, 'Template' ); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function _navbar( args ) if not args[1] then return error('No name provided') end local good, title, talk_title; good, title, talk_title = pcall( getTitle, args[1] ); if not good then return error('Expensive parser function limit exceeded'); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p 924e9b311289b0949df21e826b581d4df207d4d5 Module:Yesno 828 3 30 29 2013-03-23T08:35:23Z wikipedia>Mr. Stradivarius 0 get arguments from the parent frame if the current frame doesn't have any Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do any = true retvals[k] = v end end val = args[1] -- According to the template docs, the input should be considered nil -- only when no params were provided. If any params at all were present, -- the value must be considered blank. A bit weird, if you ask me. if (val == nil and not any) or val == '¬' then return retvals['¬'] end val = (val or ''):lower() -- Coerce to blank if nil; make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] ~= nil and retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p 2263e364a507416c9b9ccff05141bc2f8425f8db 31 30 2013-03-23T10:18:36Z wikipedia>Mr. Stradivarius 0 tweak logic to make it work like the actual template - the documentation was slightly wrong Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do any = true retvals[k] = v end end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Coerce to blank if nil; make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p f5474a5774b92e4eadaf7277e7dd4cce105fad28 32 31 2013-03-23T10:21:43Z wikipedia>Mr. Stradivarius 0 fix logic for the case where the first positional parameter is "¬" Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do any = true retvals[k] = v end end val = args[1] -- First deal with the case if val is nil or "¬", then deal with other cases. if val == nil or val == '¬' then return retvals['¬'] end val = val:lower() -- Coerce to blank if nil; make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p 8a566c02260966c5b8ee485d75d9a6090a886517 33 32 2013-03-23T10:29:46Z wikipedia>Mr. Stradivarius 0 removing code that's no longer used Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do retvals[k] = v end end val = args[1] -- First deal with the case if val is nil or "¬", then deal with other cases. if val == nil or val == '¬' then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or val == '0' then return retvals['no'] elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then return retvals['yes'] else return retvals['def'] end end return p 2ef4b5ec805f8f37e1e5dade1ca6cf8402fb85c2 34 33 2013-03-23T14:12:20Z wikipedia>Mr. Stradivarius 0 fix bugs highlighted in [[Module talk:Yesno/testcases]] Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do retvals[k] = v end end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or tonumber(val) == 0 then return retvals['no'] elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then return retvals['yes'] elseif val == '¬' then return retvals['¬'] else return retvals['def'] or retvals['yes'] end end return p 7d4c48d314a37da69cb5a4ac4d7d6a9ca3794011 35 34 2013-03-23T17:15:46Z wikipedia>Mr. Stradivarius 0 more accurate default value for "no" Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "<!-- null -->", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do retvals[k] = v end end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or tonumber(val) == 0 then return retvals['no'] elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then return retvals['yes'] elseif val == '¬' then return retvals['¬'] else return retvals['def'] or retvals['yes'] end end return p a425ccbf4a89fc4ccabe26f3cb66f548cbbecbfd 36 35 2013-03-24T03:01:17Z wikipedia>Mr. Stradivarius 0 back to the old "no" value, per talk Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. -- 'any' tracks the presence of any arguments at all. local args = frame.args local any = false for k,v in pairs(args) do any = true retvals[k] = v end -- If there are no arguments, try and get them from the parent frame. if any == false then local pframe = frame:getParent() args = pframe.args for k,v in pairs(args) do retvals[k] = v end end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or tonumber(val) == 0 then return retvals['no'] elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then return retvals['yes'] elseif val == '¬' then return retvals['¬'] else return retvals['def'] or retvals['yes'] end end return p 7d4c48d314a37da69cb5a4ac4d7d6a9ca3794011 37 36 2013-03-28T10:09:42Z wikipedia>Mr. Stradivarius 0 simplify/optimise Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. Arguments are taken from -- the parent frame; other arguments are ignored. for k,v in pairs(frame:getParent().args) do retvals[k] = v end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. -- Cases are ordered by (probable) likelihood of use. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'yes' then return retvals['yes'] elseif val == 'no' then return retvals['no'] elseif val == 'y' then return retvals['yes'] elseif val == 'n' then return retvals['no'] elseif val == '¬' then return retvals['¬'] elseif tonumber(val) == 1 then return retvals['yes'] elseif tonumber(val) == 0 then return retvals['no'] else return retvals['def'] or retvals['yes'] end end return p 97ae62bf7e2afce173ad173b8e224a2093aa9d29 38 37 2013-03-28T10:11:04Z wikipedia>Mr. Stradivarius 0 use frame.args for testing Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. Arguments are taken from -- the parent frame; other arguments are ignored. for k,v in pairs(frame.args) do retvals[k] = v end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. -- Cases are ordered by (probable) likelihood of use. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'yes' then return retvals['yes'] elseif val == 'no' then return retvals['no'] elseif val == 'y' then return retvals['yes'] elseif val == 'n' then return retvals['no'] elseif val == '¬' then return retvals['¬'] elseif tonumber(val) == 1 then return retvals['yes'] elseif tonumber(val) == 0 then return retvals['no'] else return retvals['def'] or retvals['yes'] end end return p fa015b5736c5f758a1c57a5159e8e89b5cc04653 39 38 2013-03-28T10:12:14Z wikipedia>Mr. Stradivarius 0 fix variable name Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. Arguments are taken from -- the parent frame; other arguments are ignored. for k,v in pairs(frame.args) do retvals[k] = v end val = frame.args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. -- Cases are ordered by (probable) likelihood of use. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'yes' then return retvals['yes'] elseif val == 'no' then return retvals['no'] elseif val == 'y' then return retvals['yes'] elseif val == 'n' then return retvals['no'] elseif val == '¬' then return retvals['¬'] elseif tonumber(val) == 1 then return retvals['yes'] elseif tonumber(val) == 0 then return retvals['no'] else return retvals['def'] or retvals['yes'] end end return p 2365315153fe3cf890d1a685f58ca137aa9bf20d 40 39 2013-03-28T10:13:38Z wikipedia>Mr. Stradivarius 0 use parent args again Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. Arguments are taken from -- the parent frame; other arguments are ignored. for k,v in pairs(frame:getParent().args) do retvals[k] = v end val = frame:getParent().args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. -- Cases are ordered by (probable) likelihood of use. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'yes' then return retvals['yes'] elseif val == 'no' then return retvals['no'] elseif val == 'y' then return retvals['yes'] elseif val == 'n' then return retvals['no'] elseif val == '¬' then return retvals['¬'] elseif tonumber(val) == 1 then return retvals['yes'] elseif tonumber(val) == 0 then return retvals['no'] else return retvals['def'] or retvals['yes'] end end return p 94809aa00148688f4027ac9d7ae15a045edbf990 41 40 2013-03-28T10:25:08Z wikipedia>Mr. Stradivarius 0 better code for getting args Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. Arguments are taken from -- the parent frame; other arguments are ignored. local args; if frame == mw.getCurrentFrame() then -- We're being called via #invoke. If the invoking template passed any args, use -- them. Otherwise, use the args that were passed into the template. args = frame:getParent().args; for k, v in pairs(frame.args) do args = frame.args; break end else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame; end for k,v in pairs(args) do retvals[k] = v end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or tonumber(val) == 0 then return retvals['no'] elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then return retvals['yes'] elseif val == '¬' then return retvals['¬'] else return retvals['def'] or retvals['yes'] end end return p 6a9ddc4b1561a39af97d5aa9080423cd859a1f4d 42 41 2013-03-28T10:26:46Z wikipedia>Mr. Stradivarius 0 edit inaccurate comment Scribunto text/plain local p = {} function p.yesno(frame) -- defaults local retvals = { yes = "yes", no = "", ["¬"] = "" } -- Allow arguments to override defaults. local args; if frame == mw.getCurrentFrame() then -- We're being called via #invoke. If the invoking template passed any args, use -- them. Otherwise, use the args that were passed into the template. args = frame:getParent().args; for k, v in pairs(frame.args) do args = frame.args; break end else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame; end for k,v in pairs(args) do retvals[k] = v end val = args[1] -- First deal with the case if val is nil, then deal with other cases. if val == nil then return retvals['¬'] end val = val:lower() -- Make lowercase. val = val:match'^%s*(.*%S)' or '' -- Trim whitespace. if val == '' then return retvals['blank'] or retvals['no'] elseif val == 'n' or val == 'no' or tonumber(val) == 0 then return retvals['no'] elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then return retvals['yes'] elseif val == '¬' then return retvals['¬'] else return retvals['def'] or retvals['yes'] end end return p 42ce8c09904f0a4c0f5c16863a2a6f8818b6a3ad Template:Infobox 10 11 579 578 2013-05-23T09:13:22Z wikipedia>MSGJ 0 code for sub boxes, discussed on talk page wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes |padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent; |border-spacing: 3px; width:22em; }} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass3|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}"> {{{below}}} </td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 4a9f68c1a14a8ef1feb55eb06caf03316d4ca801 580 579 2013-05-27T23:38:42Z wikipedia>Plastikspork 0 Update per edit request wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes |padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent; |border-spacing: 3px; width:22em; }} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{{title|}}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass3|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}"> {{{below}}} </td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{main other|{{#ifeq:{{{decat|}}}|yes||{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|[[Category:Articles which use embedded infobox templates with the title parameter]]}}}}{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 5de3ae67005aa3d1e91d3064d71fa08d3c296500 581 580 2013-06-04T12:37:49Z wikipedia>Mr. Stradivarius 0 switch to Lua implementation wikitext text/x-wiki {{#invoke:Infobox|infobox}}<noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> adcda4ac544f8af340cf47833dc2960631593988 582 581 2013-06-04T12:46:49Z wikipedia>Mr. Stradivarius 0 [[WP:RBK|Reverted]] edits by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) to last version by Plastikspork - this is causing issues with infobox airline wikitext text/x-wiki {{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes |padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent; |border-spacing: 3px; width:22em; }} {{{bodystyle|}}}"><!-- Caption -->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header -->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}} }}{{#ifeq:{{{child|}}}|yes|{{{title|}}}}}<!-- Subheader1 -->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row |data={{{subheader|{{{subheader1|}}}}}} |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}} }} }}<!-- Subheader2 -->{{#if:{{{subheader2|}}}|{{Infobox/row |data={{{subheader2}}} |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}} |class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}} }} }}<!-- Image1 -->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}} }} }}<!-- Image2 -->{{#if:{{{image2|}}}|{{Infobox/row |data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}} }} }}<!-- Image3 -->{{#if:{{{image3|}}}|{{Infobox/row |data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}} |class={{{imageclass|}}} |rowclass={{{imagerowclass3|}}} }} }}<!-- -->{{Infobox/row |header={{{header1|}}} |headerstyle={{{headerstyle|}}} |label={{{label1|}}} |labelstyle={{{labelstyle|}}} |data={{{data1|}}} |datastyle={{{datastyle|}}} |class={{{class1|}}} |rowclass={{{rowclass1|}}} }}{{Infobox/row |header={{{header2|}}} |headerstyle={{{headerstyle|}}} |label={{{label2|}}} |labelstyle={{{labelstyle|}}} |data={{{data2|}}} |datastyle={{{datastyle|}}} |class={{{class2|}}} |rowclass={{{rowclass2|}}} }}{{Infobox/row |header={{{header3|}}} |headerstyle={{{headerstyle|}}} |label={{{label3|}}} |labelstyle={{{labelstyle|}}} |data={{{data3|}}} |datastyle={{{datastyle|}}} |class={{{class3|}}} |rowclass={{{rowclass3|}}} }}{{Infobox/row |header={{{header4|}}} |headerstyle={{{headerstyle|}}} |label={{{label4|}}} |labelstyle={{{labelstyle|}}} |data={{{data4|}}} |datastyle={{{datastyle|}}} |class={{{class4|}}} |rowclass={{{rowclass4|}}} }}{{Infobox/row |header={{{header5|}}} |headerstyle={{{headerstyle|}}} |label={{{label5|}}} |labelstyle={{{labelstyle|}}} |data={{{data5|}}} |datastyle={{{datastyle|}}} |class={{{class5|}}} |rowclass={{{rowclass5|}}} }}{{Infobox/row |header={{{header6|}}} |headerstyle={{{headerstyle|}}} |label={{{label6|}}} |labelstyle={{{labelstyle|}}} |data={{{data6|}}} |datastyle={{{datastyle|}}} |class={{{class6|}}} |rowclass={{{rowclass6|}}} }}{{Infobox/row |header={{{header7|}}} |headerstyle={{{headerstyle|}}} |label={{{label7|}}} |labelstyle={{{labelstyle|}}} |data={{{data7|}}} |datastyle={{{datastyle|}}} |class={{{class7|}}} |rowclass={{{rowclass7|}}} }}{{Infobox/row |header={{{header8|}}} |headerstyle={{{headerstyle|}}} |label={{{label8|}}} |labelstyle={{{labelstyle|}}} |data={{{data8|}}} |datastyle={{{datastyle|}}} |class={{{class8|}}} |rowclass={{{rowclass8|}}} }}{{Infobox/row |header={{{header9|}}} |headerstyle={{{headerstyle|}}} |label={{{label9|}}} |labelstyle={{{labelstyle|}}} |data={{{data9|}}} |datastyle={{{datastyle|}}} |class={{{class9|}}} |rowclass={{{rowclass9|}}} }}{{Infobox/row |header={{{header10|}}} |headerstyle={{{headerstyle|}}} |label={{{label10|}}} |labelstyle={{{labelstyle|}}} |data={{{data10|}}} |datastyle={{{datastyle|}}} |class={{{class10|}}} |rowclass={{{rowclass10|}}} }}{{Infobox/row |header={{{header11|}}} |headerstyle={{{headerstyle|}}} |label={{{label11|}}} |labelstyle={{{labelstyle|}}} |data={{{data11|}}} |datastyle={{{datastyle|}}} |class={{{class11|}}} |rowclass={{{rowclass11|}}} }}{{Infobox/row |header={{{header12|}}} |headerstyle={{{headerstyle|}}} |label={{{label12|}}} |labelstyle={{{labelstyle|}}} |data={{{data12|}}} |datastyle={{{datastyle|}}} |class={{{class12|}}} |rowclass={{{rowclass12|}}} }}{{Infobox/row |header={{{header13|}}} |headerstyle={{{headerstyle|}}} |label={{{label13|}}} |labelstyle={{{labelstyle|}}} |data={{{data13|}}} |datastyle={{{datastyle|}}} |class={{{class13|}}} |rowclass={{{rowclass13|}}} }}{{Infobox/row |header={{{header14|}}} |headerstyle={{{headerstyle|}}} |label={{{label14|}}} |labelstyle={{{labelstyle|}}} |data={{{data14|}}} |datastyle={{{datastyle|}}} |class={{{class14|}}} |rowclass={{{rowclass14|}}} }}{{Infobox/row |header={{{header15|}}} |headerstyle={{{headerstyle|}}} |label={{{label15|}}} |labelstyle={{{labelstyle|}}} |data={{{data15|}}} |datastyle={{{datastyle|}}} |class={{{class15|}}} |rowclass={{{rowclass15|}}} }}{{Infobox/row |header={{{header16|}}} |headerstyle={{{headerstyle|}}} |label={{{label16|}}} |labelstyle={{{labelstyle|}}} |data={{{data16|}}} |datastyle={{{datastyle|}}} |class={{{class16|}}} |rowclass={{{rowclass16|}}} }}{{Infobox/row |header={{{header17|}}} |headerstyle={{{headerstyle|}}} |label={{{label17|}}} |labelstyle={{{labelstyle|}}} |data={{{data17|}}} |datastyle={{{datastyle|}}} |class={{{class17|}}} |rowclass={{{rowclass17|}}} }}{{Infobox/row |header={{{header18|}}} |headerstyle={{{headerstyle|}}} |label={{{label18|}}} |labelstyle={{{labelstyle|}}} |data={{{data18|}}} |datastyle={{{datastyle|}}} |class={{{class18|}}} |rowclass={{{rowclass18|}}} }}{{Infobox/row |header={{{header19|}}} |headerstyle={{{headerstyle|}}} |label={{{label19|}}} |labelstyle={{{labelstyle|}}} |data={{{data19|}}} |datastyle={{{datastyle|}}} |class={{{class19|}}} |rowclass={{{rowclass19|}}} }}{{Infobox/row |header={{{header20|}}} |headerstyle={{{headerstyle|}}} |label={{{label20|}}} |labelstyle={{{labelstyle|}}} |data={{{data20|}}} |datastyle={{{datastyle|}}} |class={{{class20|}}} |rowclass={{{rowclass20|}}} }}{{Infobox/row |header={{{header21|}}} |headerstyle={{{headerstyle|}}} |label={{{label21|}}} |labelstyle={{{labelstyle|}}} |data={{{data21|}}} |datastyle={{{datastyle|}}} |class={{{class21|}}} |rowclass={{{rowclass21|}}} }}{{Infobox/row |header={{{header22|}}} |headerstyle={{{headerstyle|}}} |label={{{label22|}}} |labelstyle={{{labelstyle|}}} |data={{{data22|}}} |datastyle={{{datastyle|}}} |class={{{class22|}}} |rowclass={{{rowclass22|}}} }}{{Infobox/row |header={{{header23|}}} |headerstyle={{{headerstyle|}}} |label={{{label23|}}} |labelstyle={{{labelstyle|}}} |data={{{data23|}}} |datastyle={{{datastyle|}}} |class={{{class23|}}} |rowclass={{{rowclass23|}}} }}{{Infobox/row |header={{{header24|}}} |headerstyle={{{headerstyle|}}} |label={{{label24|}}} |labelstyle={{{labelstyle|}}} |data={{{data24|}}} |datastyle={{{datastyle|}}} |class={{{class24|}}} |rowclass={{{rowclass24|}}} }}{{Infobox/row |header={{{header25|}}} |headerstyle={{{headerstyle|}}} |label={{{label25|}}} |labelstyle={{{labelstyle|}}} |data={{{data25|}}} |datastyle={{{datastyle|}}} |class={{{class25|}}} |rowclass={{{rowclass25|}}} }}{{Infobox/row |header={{{header26|}}} |headerstyle={{{headerstyle|}}} |label={{{label26|}}} |labelstyle={{{labelstyle|}}} |data={{{data26|}}} |datastyle={{{datastyle|}}} |class={{{class26|}}} |rowclass={{{rowclass26|}}} }}{{Infobox/row |header={{{header27|}}} |headerstyle={{{headerstyle|}}} |label={{{label27|}}} |labelstyle={{{labelstyle|}}} |data={{{data27|}}} |datastyle={{{datastyle|}}} |class={{{class27|}}} |rowclass={{{rowclass27|}}} }}{{Infobox/row |header={{{header28|}}} |headerstyle={{{headerstyle|}}} |label={{{label28|}}} |labelstyle={{{labelstyle|}}} |data={{{data28|}}} |datastyle={{{datastyle|}}} |class={{{class28|}}} |rowclass={{{rowclass28|}}} }}{{Infobox/row |header={{{header29|}}} |headerstyle={{{headerstyle|}}} |label={{{label29|}}} |labelstyle={{{labelstyle|}}} |data={{{data29|}}} |datastyle={{{datastyle|}}} |class={{{class29|}}} |rowclass={{{rowclass29|}}} }}{{Infobox/row |header={{{header30|}}} |headerstyle={{{headerstyle|}}} |label={{{label30|}}} |labelstyle={{{labelstyle|}}} |data={{{data30|}}} |datastyle={{{datastyle|}}} |class={{{class30|}}} |rowclass={{{rowclass30|}}} }}{{Infobox/row |header={{{header31|}}} |headerstyle={{{headerstyle|}}} |label={{{label31|}}} |labelstyle={{{labelstyle|}}} |data={{{data31|}}} |datastyle={{{datastyle|}}} |class={{{class31|}}} |rowclass={{{rowclass31|}}} }}{{Infobox/row |header={{{header32|}}} |headerstyle={{{headerstyle|}}} |label={{{label32|}}} |labelstyle={{{labelstyle|}}} |data={{{data32|}}} |datastyle={{{datastyle|}}} |class={{{class32|}}} |rowclass={{{rowclass32|}}} }}{{Infobox/row |header={{{header33|}}} |headerstyle={{{headerstyle|}}} |label={{{label33|}}} |labelstyle={{{labelstyle|}}} |data={{{data33|}}} |datastyle={{{datastyle|}}} |class={{{class33|}}} |rowclass={{{rowclass33|}}} }}{{Infobox/row |header={{{header34|}}} |headerstyle={{{headerstyle|}}} |label={{{label34|}}} |labelstyle={{{labelstyle|}}} |data={{{data34|}}} |datastyle={{{datastyle|}}} |class={{{class34|}}} |rowclass={{{rowclass34|}}} }}{{Infobox/row |header={{{header35|}}} |headerstyle={{{headerstyle|}}} |label={{{label35|}}} |labelstyle={{{labelstyle|}}} |data={{{data35|}}} |datastyle={{{datastyle|}}} |class={{{class35|}}} |rowclass={{{rowclass35|}}} }}{{Infobox/row |header={{{header36|}}} |headerstyle={{{headerstyle|}}} |label={{{label36|}}} |labelstyle={{{labelstyle|}}} |data={{{data36|}}} |datastyle={{{datastyle|}}} |class={{{class36|}}} |rowclass={{{rowclass36|}}} }}{{Infobox/row |header={{{header37|}}} |headerstyle={{{headerstyle|}}} |label={{{label37|}}} |labelstyle={{{labelstyle|}}} |data={{{data37|}}} |datastyle={{{datastyle|}}} |class={{{class37|}}} |rowclass={{{rowclass37|}}} }}{{Infobox/row |header={{{header38|}}} |headerstyle={{{headerstyle|}}} |label={{{label38|}}} |labelstyle={{{labelstyle|}}} |data={{{data38|}}} |datastyle={{{datastyle|}}} |class={{{class38|}}} |rowclass={{{rowclass38|}}} }}{{Infobox/row |header={{{header39|}}} |headerstyle={{{headerstyle|}}} |label={{{label39|}}} |labelstyle={{{labelstyle|}}} |data={{{data39|}}} |datastyle={{{datastyle|}}} |class={{{class39|}}} |rowclass={{{rowclass39|}}} }}{{Infobox/row |header={{{header40|}}} |headerstyle={{{headerstyle|}}} |label={{{label40|}}} |labelstyle={{{labelstyle|}}} |data={{{data40|}}} |datastyle={{{datastyle|}}} |class={{{class40|}}} |rowclass={{{rowclass40|}}} }}{{Infobox/row |header={{{header41|}}} |headerstyle={{{headerstyle|}}} |label={{{label41|}}} |labelstyle={{{labelstyle|}}} |data={{{data41|}}} |datastyle={{{datastyle|}}} |class={{{class41|}}} |rowclass={{{rowclass41|}}} }}{{Infobox/row |header={{{header42|}}} |headerstyle={{{headerstyle|}}} |label={{{label42|}}} |labelstyle={{{labelstyle|}}} |data={{{data42|}}} |datastyle={{{datastyle|}}} |class={{{class42|}}} |rowclass={{{rowclass42|}}} }}{{Infobox/row |header={{{header43|}}} |headerstyle={{{headerstyle|}}} |label={{{label43|}}} |labelstyle={{{labelstyle|}}} |data={{{data43|}}} |datastyle={{{datastyle|}}} |class={{{class43|}}} |rowclass={{{rowclass43|}}} }}{{Infobox/row |header={{{header44|}}} |headerstyle={{{headerstyle|}}} |label={{{label44|}}} |labelstyle={{{labelstyle|}}} |data={{{data44|}}} |datastyle={{{datastyle|}}} |class={{{class44|}}} |rowclass={{{rowclass44|}}} }}{{Infobox/row |header={{{header45|}}} |headerstyle={{{headerstyle|}}} |label={{{label45|}}} |labelstyle={{{labelstyle|}}} |data={{{data45|}}} |datastyle={{{datastyle|}}} |class={{{class45|}}} |rowclass={{{rowclass45|}}} }}{{Infobox/row |header={{{header46|}}} |headerstyle={{{headerstyle|}}} |label={{{label46|}}} |labelstyle={{{labelstyle|}}} |data={{{data46|}}} |datastyle={{{datastyle|}}} |class={{{class46|}}} |rowclass={{{rowclass46|}}} }}{{Infobox/row |header={{{header47|}}} |headerstyle={{{headerstyle|}}} |label={{{label47|}}} |labelstyle={{{labelstyle|}}} |data={{{data47|}}} |datastyle={{{datastyle|}}} |class={{{class47|}}} |rowclass={{{rowclass47|}}} }}{{Infobox/row |header={{{header48|}}} |headerstyle={{{headerstyle|}}} |label={{{label48|}}} |labelstyle={{{labelstyle|}}} |data={{{data48|}}} |datastyle={{{datastyle|}}} |class={{{class48|}}} |rowclass={{{rowclass48|}}} }}{{Infobox/row |header={{{header49|}}} |headerstyle={{{headerstyle|}}} |label={{{label49|}}} |labelstyle={{{labelstyle|}}} |data={{{data49|}}} |datastyle={{{datastyle|}}} |class={{{class49|}}} |rowclass={{{rowclass49|}}} }}{{Infobox/row |header={{{header50|}}} |headerstyle={{{headerstyle|}}} |label={{{label50|}}} |labelstyle={{{labelstyle|}}} |data={{{data50|}}} |datastyle={{{datastyle|}}} |class={{{class50|}}} |rowclass={{{rowclass50|}}} }}{{Infobox/row |header={{{header51|}}} |headerstyle={{{headerstyle|}}} |label={{{label51|}}} |labelstyle={{{labelstyle|}}} |data={{{data51|}}} |datastyle={{{datastyle|}}} |class={{{class51|}}} |rowclass={{{rowclass51|}}} }}{{Infobox/row |header={{{header52|}}} |headerstyle={{{headerstyle|}}} |label={{{label52|}}} |labelstyle={{{labelstyle|}}} |data={{{data52|}}} |datastyle={{{datastyle|}}} |class={{{class52|}}} |rowclass={{{rowclass52|}}} }}{{Infobox/row |header={{{header53|}}} |headerstyle={{{headerstyle|}}} |label={{{label53|}}} |labelstyle={{{labelstyle|}}} |data={{{data53|}}} |datastyle={{{datastyle|}}} |class={{{class53|}}} |rowclass={{{rowclass53|}}} }}{{Infobox/row |header={{{header54|}}} |headerstyle={{{headerstyle|}}} |label={{{label54|}}} |labelstyle={{{labelstyle|}}} |data={{{data54|}}} |datastyle={{{datastyle|}}} |class={{{class54|}}} |rowclass={{{rowclass54|}}} }}{{Infobox/row |header={{{header55|}}} |headerstyle={{{headerstyle|}}} |label={{{label55|}}} |labelstyle={{{labelstyle|}}} |data={{{data55|}}} |datastyle={{{datastyle|}}} |class={{{class55|}}} |rowclass={{{rowclass55|}}} }}{{Infobox/row |header={{{header56|}}} |headerstyle={{{headerstyle|}}} |label={{{label56|}}} |labelstyle={{{labelstyle|}}} |data={{{data56|}}} |datastyle={{{datastyle|}}} |class={{{class56|}}} |rowclass={{{rowclass56|}}} }}{{Infobox/row |header={{{header57|}}} |headerstyle={{{headerstyle|}}} |label={{{label57|}}} |labelstyle={{{labelstyle|}}} |data={{{data57|}}} |datastyle={{{datastyle|}}} |class={{{class57|}}} |rowclass={{{rowclass57|}}} }}{{Infobox/row |header={{{header58|}}} |headerstyle={{{headerstyle|}}} |label={{{label58|}}} |labelstyle={{{labelstyle|}}} |data={{{data58|}}} |datastyle={{{datastyle|}}} |class={{{class58|}}} |rowclass={{{rowclass58|}}} }}{{Infobox/row |header={{{header59|}}} |headerstyle={{{headerstyle|}}} |label={{{label59|}}} |labelstyle={{{labelstyle|}}} |data={{{data59|}}} |datastyle={{{datastyle|}}} |class={{{class59|}}} |rowclass={{{rowclass59|}}} }}{{Infobox/row |header={{{header60|}}} |headerstyle={{{headerstyle|}}} |label={{{label60|}}} |labelstyle={{{labelstyle|}}} |data={{{data60|}}} |datastyle={{{datastyle|}}} |class={{{class60|}}} |rowclass={{{rowclass60|}}} }}{{Infobox/row |header={{{header61|}}} |headerstyle={{{headerstyle|}}} |label={{{label61|}}} |labelstyle={{{labelstyle|}}} |data={{{data61|}}} |datastyle={{{datastyle|}}} |class={{{class61|}}} |rowclass={{{rowclass61|}}} }}{{Infobox/row |header={{{header62|}}} |headerstyle={{{headerstyle|}}} |label={{{label62|}}} |labelstyle={{{labelstyle|}}} |data={{{data62|}}} |datastyle={{{datastyle|}}} |class={{{class62|}}} |rowclass={{{rowclass62|}}} }}{{Infobox/row |header={{{header63|}}} |headerstyle={{{headerstyle|}}} |label={{{label63|}}} |labelstyle={{{labelstyle|}}} |data={{{data63|}}} |datastyle={{{datastyle|}}} |class={{{class63|}}} |rowclass={{{rowclass63|}}} }}{{Infobox/row |header={{{header64|}}} |headerstyle={{{headerstyle|}}} |label={{{label64|}}} |labelstyle={{{labelstyle|}}} |data={{{data64|}}} |datastyle={{{datastyle|}}} |class={{{class64|}}} |rowclass={{{rowclass64|}}} }}{{Infobox/row |header={{{header65|}}} |headerstyle={{{headerstyle|}}} |label={{{label65|}}} |labelstyle={{{labelstyle|}}} |data={{{data65|}}} |datastyle={{{datastyle|}}} |class={{{class65|}}} |rowclass={{{rowclass65|}}} }}{{Infobox/row |header={{{header66|}}} |headerstyle={{{headerstyle|}}} |label={{{label66|}}} |labelstyle={{{labelstyle|}}} |data={{{data66|}}} |datastyle={{{datastyle|}}} |class={{{class66|}}} |rowclass={{{rowclass66|}}} }}{{Infobox/row |header={{{header67|}}} |headerstyle={{{headerstyle|}}} |label={{{label67|}}} |labelstyle={{{labelstyle|}}} |data={{{data67|}}} |datastyle={{{datastyle|}}} |class={{{class67|}}} |rowclass={{{rowclass67|}}} }}{{Infobox/row |header={{{header68|}}} |headerstyle={{{headerstyle|}}} |label={{{label68|}}} |labelstyle={{{labelstyle|}}} |data={{{data68|}}} |datastyle={{{datastyle|}}} |class={{{class68|}}} |rowclass={{{rowclass68|}}} }}{{Infobox/row |header={{{header69|}}} |headerstyle={{{headerstyle|}}} |label={{{label69|}}} |labelstyle={{{labelstyle|}}} |data={{{data69|}}} |datastyle={{{datastyle|}}} |class={{{class69|}}} |rowclass={{{rowclass69|}}} }}{{Infobox/row |header={{{header70|}}} |headerstyle={{{headerstyle|}}} |label={{{label70|}}} |labelstyle={{{labelstyle|}}} |data={{{data70|}}} |datastyle={{{datastyle|}}} |class={{{class70|}}} |rowclass={{{rowclass70|}}} }}{{Infobox/row |header={{{header71|}}} |headerstyle={{{headerstyle|}}} |label={{{label71|}}} |labelstyle={{{labelstyle|}}} |data={{{data71|}}} |datastyle={{{datastyle|}}} |class={{{class71|}}} |rowclass={{{rowclass71|}}} }}{{Infobox/row |header={{{header72|}}} |headerstyle={{{headerstyle|}}} |label={{{label72|}}} |labelstyle={{{labelstyle|}}} |data={{{data72|}}} |datastyle={{{datastyle|}}} |class={{{class72|}}} |rowclass={{{rowclass72|}}} }}{{Infobox/row |header={{{header73|}}} |headerstyle={{{headerstyle|}}} |label={{{label73|}}} |labelstyle={{{labelstyle|}}} |data={{{data73|}}} |datastyle={{{datastyle|}}} |class={{{class73|}}} |rowclass={{{rowclass73|}}} }}{{Infobox/row |header={{{header74|}}} |headerstyle={{{headerstyle|}}} |label={{{label74|}}} |labelstyle={{{labelstyle|}}} |data={{{data74|}}} |datastyle={{{datastyle|}}} |class={{{class74|}}} |rowclass={{{rowclass74|}}} }}{{Infobox/row |header={{{header75|}}} |headerstyle={{{headerstyle|}}} |label={{{label75|}}} |labelstyle={{{labelstyle|}}} |data={{{data75|}}} |datastyle={{{datastyle|}}} |class={{{class75|}}} |rowclass={{{rowclass75|}}} }}{{Infobox/row |header={{{header76|}}} |headerstyle={{{headerstyle|}}} |label={{{label76|}}} |labelstyle={{{labelstyle|}}} |data={{{data76|}}} |datastyle={{{datastyle|}}} |class={{{class76|}}} |rowclass={{{rowclass76|}}} }}{{Infobox/row |header={{{header77|}}} |headerstyle={{{headerstyle|}}} |label={{{label77|}}} |labelstyle={{{labelstyle|}}} |data={{{data77|}}} |datastyle={{{datastyle|}}} |class={{{class77|}}} |rowclass={{{rowclass77|}}} }}{{Infobox/row |header={{{header78|}}} |headerstyle={{{headerstyle|}}} |label={{{label78|}}} |labelstyle={{{labelstyle|}}} |data={{{data78|}}} |datastyle={{{datastyle|}}} |class={{{class78|}}} |rowclass={{{rowclass78|}}} }}{{Infobox/row |header={{{header79|}}} |headerstyle={{{headerstyle|}}} |label={{{label79|}}} |labelstyle={{{labelstyle|}}} |data={{{data79|}}} |datastyle={{{datastyle|}}} |class={{{class79|}}} |rowclass={{{rowclass79|}}} }}{{Infobox/row |header={{{header80|}}} |headerstyle={{{headerstyle|}}} |label={{{label80|}}} |labelstyle={{{labelstyle|}}} |data={{{data80|}}} |datastyle={{{datastyle|}}} |class={{{class80|}}} |rowclass={{{rowclass80|}}} }}{{Infobox/row |header={{{header81|}}} |headerstyle={{{headerstyle|}}} |label={{{label81|}}} |labelstyle={{{labelstyle|}}} |data={{{data81|}}} |datastyle={{{datastyle|}}} |class={{{class81|}}} |rowclass={{{rowclass81|}}} }}{{Infobox/row |header={{{header82|}}} |headerstyle={{{headerstyle|}}} |label={{{label82|}}} |labelstyle={{{labelstyle|}}} |data={{{data82|}}} |datastyle={{{datastyle|}}} |class={{{class82|}}} |rowclass={{{rowclass82|}}} }}{{Infobox/row |header={{{header83|}}} |headerstyle={{{headerstyle|}}} |label={{{label83|}}} |labelstyle={{{labelstyle|}}} |data={{{data83|}}} |datastyle={{{datastyle|}}} |class={{{class83|}}} |rowclass={{{rowclass83|}}} }}{{Infobox/row |header={{{header84|}}} |headerstyle={{{headerstyle|}}} |label={{{label84|}}} |labelstyle={{{labelstyle|}}} |data={{{data84|}}} |datastyle={{{datastyle|}}} |class={{{class84|}}} |rowclass={{{rowclass84|}}} }}{{Infobox/row |header={{{header85|}}} |headerstyle={{{headerstyle|}}} |label={{{label85|}}} |labelstyle={{{labelstyle|}}} |data={{{data85|}}} |datastyle={{{datastyle|}}} |class={{{class85|}}} |rowclass={{{rowclass85|}}} }}{{Infobox/row |header={{{header86|}}} |headerstyle={{{headerstyle|}}} |label={{{label86|}}} |labelstyle={{{labelstyle|}}} |data={{{data86|}}} |datastyle={{{datastyle|}}} |class={{{class86|}}} |rowclass={{{rowclass86|}}} }}{{Infobox/row |header={{{header87|}}} |headerstyle={{{headerstyle|}}} |label={{{label87|}}} |labelstyle={{{labelstyle|}}} |data={{{data87|}}} |datastyle={{{datastyle|}}} |class={{{class87|}}} |rowclass={{{rowclass87|}}} }}{{Infobox/row |header={{{header88|}}} |headerstyle={{{headerstyle|}}} |label={{{label88|}}} |labelstyle={{{labelstyle|}}} |data={{{data88|}}} |datastyle={{{datastyle|}}} |class={{{class88|}}} |rowclass={{{rowclass88|}}} }}{{Infobox/row |header={{{header89|}}} |headerstyle={{{headerstyle|}}} |label={{{label89|}}} |labelstyle={{{labelstyle|}}} |data={{{data89|}}} |datastyle={{{datastyle|}}} |class={{{class89|}}} |rowclass={{{rowclass89|}}} }}{{Infobox/row |header={{{header90|}}} |headerstyle={{{headerstyle|}}} |label={{{label90|}}} |labelstyle={{{labelstyle|}}} |data={{{data90|}}} |datastyle={{{datastyle|}}} |class={{{class90|}}} |rowclass={{{rowclass90|}}} }}{{Infobox/row |header={{{header91|}}} |headerstyle={{{headerstyle|}}} |label={{{label91|}}} |labelstyle={{{labelstyle|}}} |data={{{data91|}}} |datastyle={{{datastyle|}}} |class={{{class91|}}} |rowclass={{{rowclass91|}}} }}{{Infobox/row |header={{{header92|}}} |headerstyle={{{headerstyle|}}} |label={{{label92|}}} |labelstyle={{{labelstyle|}}} |data={{{data92|}}} |datastyle={{{datastyle|}}} |class={{{class92|}}} |rowclass={{{rowclass92|}}} }}{{Infobox/row |header={{{header93|}}} |headerstyle={{{headerstyle|}}} |label={{{label93|}}} |labelstyle={{{labelstyle|}}} |data={{{data93|}}} |datastyle={{{datastyle|}}} |class={{{class93|}}} |rowclass={{{rowclass93|}}} }}{{Infobox/row |header={{{header94|}}} |headerstyle={{{headerstyle|}}} |label={{{label94|}}} |labelstyle={{{labelstyle|}}} |data={{{data94|}}} |datastyle={{{datastyle|}}} |class={{{class94|}}} |rowclass={{{rowclass94|}}} }}{{Infobox/row |header={{{header95|}}} |headerstyle={{{headerstyle|}}} |label={{{label95|}}} |labelstyle={{{labelstyle|}}} |data={{{data95|}}} |datastyle={{{datastyle|}}} |class={{{class95|}}} |rowclass={{{rowclass95|}}} }}{{Infobox/row |header={{{header96|}}} |headerstyle={{{headerstyle|}}} |label={{{label96|}}} |labelstyle={{{labelstyle|}}} |data={{{data96|}}} |datastyle={{{datastyle|}}} |class={{{class96|}}} |rowclass={{{rowclass96|}}} }}{{Infobox/row |header={{{header97|}}} |headerstyle={{{headerstyle|}}} |label={{{label97|}}} |labelstyle={{{labelstyle|}}} |data={{{data97|}}} |datastyle={{{datastyle|}}} |class={{{class97|}}} |rowclass={{{rowclass97|}}} }}{{Infobox/row |header={{{header98|}}} |headerstyle={{{headerstyle|}}} |label={{{label98|}}} |labelstyle={{{labelstyle|}}} |data={{{data98|}}} |datastyle={{{datastyle|}}} |class={{{class98|}}} |rowclass={{{rowclass98|}}} }}{{Infobox/row |header={{{header99|}}} |headerstyle={{{headerstyle|}}} |label={{{label99|}}} |labelstyle={{{labelstyle|}}} |data={{{data99|}}} |datastyle={{{datastyle|}}} |class={{{class99|}}} |rowclass={{{rowclass99|}}} }}<!-- Below -->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}"> {{{below}}} </td></tr>}}<!-- Navbar -->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}} {{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}} |¬|no = <!-- no italic title --> ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}} }}<includeonly>{{main other|{{#ifeq:{{{decat|}}}|yes||{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|[[Category:Articles which use embedded infobox templates with the title parameter]]}}}}{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 5de3ae67005aa3d1e91d3064d71fa08d3c296500 583 582 2013-06-05T09:16:23Z wikipedia>Mr. Stradivarius 0 switch back to Lua implementation - issues with [[Template:Infobox airline]] have now been addressed wikitext text/x-wiki {{#invoke:Infobox|infobox}}<noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> adcda4ac544f8af340cf47833dc2960631593988 Module:Infobox 828 10 297 296 2013-06-01T07:06:22Z wikipedia>Mr. Stradivarius 0 update with subbox parameter Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() if args.title then root.wikitext("'''" .. args.title .. "'''") end end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p ec2c271760deef8b6d9c68d92008ae99f04e30ae 298 297 2013-06-01T07:12:06Z wikipedia>Mr. Stradivarius 0 remove title bolding as with main template Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p e4461aceba36b6c7b9e18e8e63a845e5f25a7d14 299 298 2013-06-01T07:23:09Z wikipedia>Mr. Stradivarius 0 add tracking category per main template Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '(%d+)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p eb7d68bd064d3a339c6b8bf360f6724eb46f9ac4 300 299 2013-06-01T07:59:07Z wikipedia>Mr. Stradivarius 0 disallow zero-numbered row parameters Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if v ~= '' or k == 'italic title' then args[k] = v end end return _infobox() end return p fee03dcba06ab0da53d0a539590032f5ee7fa2ef 301 300 2013-06-01T08:02:43Z wikipedia>Mr. Stradivarius 0 make all whitespace arguments nil, rather than just empty string arguments Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p a1b39f1625602bf9ff874e7f0eacb9f5dbe01d73 302 301 2013-06-01T08:14:41Z wikipedia>Mr. Stradivarius 0 try hack for out-of-order reflists Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end if frame.args.below and mw.ustring.match(frame.args.below, '%S') then args.below = frame.args.below end return _infobox() end return p d9184fc6bfaff8694342404eb6c6f71d8efb8f90 303 302 2013-06-01T08:27:56Z wikipedia>Mr. Stradivarius 0 Undid revision 557801976 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) nope, that doesn't work Scribunto text/plain -- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p a1b39f1625602bf9ff874e7f0eacb9f5dbe01d73 304 303 2013-06-01T08:29:19Z wikipedia>Mr. Stradivarius 0 tweak comment at the start Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p c9010d71e2742ab198f8ce35b7e600b76bd5820a 305 304 2013-06-03T15:20:33Z wikipedia>Mr. Stradivarius 0 hack to parse the parameters in the 'correct' order Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end -- This function parses the parameters with the given prefixes, in order, in batches of 20. local function touchParameters(prefixTable, origArgs) if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end local temp local argumentCounter = 1 local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = argumentCounter, argumentCounter + 19 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end argumentCounter = argumentCounter + 20 end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs) touchParameters({'image', 'caption'}, origArgs) touchParameters({'header', 'label', 'data'}, origArgs) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p 578abc2341124515a89301c989615e660e5319be 306 305 2013-06-03T15:29:54Z wikipedia>Mr. Stradivarius 0 shorter variable name for what is a pretty simple role, really Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end -- This function parses the parameters with the given prefixes, in order, in batches of 20. local function touchParameters(prefixTable, origArgs) if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end local temp local a = 1 local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a+19 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + 20 end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs) touchParameters({'image', 'caption'}, origArgs) touchParameters({'header', 'label', 'data'}, origArgs) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p 8127c538187a2c20dc156fd7da15a46ce4e47be2 307 306 2013-06-03T15:46:01Z wikipedia>Mr. Stradivarius 0 custom step degree for touchParameters Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end -- This function parses the parameters with the given prefixes, in order, in batches of the step size specified. -- If the step size is not given, the default is 20. local function touchParameters(prefixTable, origArgs, step) if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 local temp local a = 1 local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p b8bfd07781e7cd70ed5de939a6e83f0251bd005b 308 307 2013-06-03T23:45:45Z wikipedia>Mr. Stradivarius on tour 0 use tostring() in getArgNums() - this is quicker than forcing concatenation of numbers Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- return the union of the values of two tables, as a sequence local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end -- This function parses the parameters with the given prefixes, in order, in batches of the step size specified. -- If the step size is not given, the default is 20. local function touchParameters(prefixTable, origArgs, step) if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 local temp local a = 1 local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p 8c9cbf95d0452a41b69a1b0f0a01b55c8fb369b1 309 308 2013-06-04T11:30:10Z wikipedia>Mr. Stradivarius 0 better comments Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') .cssText(args.bodystyle) if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p 5ba2299a62b7795407e5adbd597823767ee0019e 310 309 2013-06-04T11:50:25Z wikipedia>Mr. Stradivarius 0 put bodystyle after other style options to match {{infobox}} Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p b8ff6a6b2d63520bbbf6d341e98cddcca271f61a 311 310 2013-06-04T12:38:01Z wikipedia>Mr. Stradivarius 0 Protected Module:Infobox: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p b8ff6a6b2d63520bbbf6d341e98cddcca271f61a 312 311 2013-06-04T12:50:03Z wikipedia>Mr. Stradivarius 0 Removed protection from "[[Module:Infobox]]": needs more testing Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p b8ff6a6b2d63520bbbf6d341e98cddcca271f61a 313 312 2013-06-04T13:03:32Z wikipedia>WOSlinker 0 add \n in renderRows Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = '\n' .. args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p b6e8f08978cb3c182ddb0d895ed40673cff8f632 314 313 2013-06-04T13:12:52Z wikipedia>WOSlinker 0 move the \n to different spot in code Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext('\n' .. rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext('\n' .. rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext('\n' .. rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p 9a779c398b087ed85375fa3b82379fcfa141648b 315 314 2013-06-04T18:57:39Z wikipedia>WOSlinker 0 no \n on headers or labels Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext('\n' .. rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p e31434c4672c43cc2ff3a0fbb3d7f71d23d03807 316 315 2013-06-04T21:48:05Z wikipedia>Mr. Stradivarius 0 add title text for child infoboxes Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .wikitext('\n' .. rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p edbf8dce2a9d3429f277b9c6ae84d96628106297 317 316 2013-06-04T21:57:20Z wikipedia>Mr. Stradivarius 0 use newline() instead of \n Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p a5c3590e43ae3fa10f0ddeba3ca1e13f1e87edf7 318 317 2013-06-05T09:15:09Z wikipedia>Mr. Stradivarius 0 Protected Module:Infobox: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function touchParameters(prefixTable, origArgs, step) -- Parse the parameters with the given prefixes, in order, in batches -- of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) end if step and type(step) ~= 'number' then error("Non-numerical step value detected.", 2) end step = step or 20 -- If the step size is not given, the default is 20. local temp local a = 1 -- Counter variable. local moreArgumentsExist = true for j,v in ipairs(prefixTable) do if not type(v) == "string" then error("Non-string value detected in the prefix table in the touchParameters function.", 2) end temp = origArgs[v] end while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do temp = origArgs[v .. tostring(i)] if temp then moreArgumentsExist = true end end end a = a + step end end function p.infobox(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. local temp temp = origArgs.title temp = origArgs.above touchParameters({'subheader'}, origArgs, 5) touchParameters({'image', 'caption'}, origArgs, 5) touchParameters({'header', 'label', 'data'}, origArgs, 20) temp = origArgs.below -- ParserFunctions considers whitespace to be false, so to preserve the previous -- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider -- them false too. (Except the 'italic title' param, which specifies different behavior -- depending on whether it's absent or empty) args = {} for k, v in pairs(origArgs) do if mw.ustring.match(v, '%S') or k == 'italic title' then args[k] = v end end return _infobox() end return p a5c3590e43ae3fa10f0ddeba3ca1e13f1e87edf7 319 318 2013-06-09T02:21:14Z wikipedia>Mr. Stradivarius 0 fix phantom reference bug Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) .newline() end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. num], datastyle = args.subheaderstyle or args['subheaderstyle' .. num], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. num] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. num] local data = HtmlBuilder.create().wikitext(args['image' .. num]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('span') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. num] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. num], label = args['label' .. num], data = args['data' .. num], datastyle = args.datastyle, class = args['class' .. num], rowclass = args['rowclass' .. num] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label', 'rowclass'}}, {prefix = 'class'} }, 50) preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p f080538a97c55b4b060b0d492db8ce721c66aad0 Module:Italic title 828 6 162 2013-06-17T07:52:25Z wikipedia>Mr. Stradivarius 0 create a replacement for [[Template:Italic title]] Scribunto text/plain local p = {} function p.main() local title = mw.title.getCurrentTitle() local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end result = '{{DISPLAYTITLE:' .. title.nsText .. result .. '}}' return mw.getCurrentFrame:preprocess(result) end return p c9589112e87a919ad56305948ad84f54ac580e2c 163 162 2013-06-17T07:58:52Z wikipedia>Mr. Stradivarius 0 try with callParserFunction instead Scribunto text/plain local p = {} function p.main() local title = mw.title.getCurrentTitle() local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', title.nsText .. result ) end return p 46e7c6cf1beb473ce84eaf0a80b9547d3633936a 164 163 2013-06-17T08:00:43Z wikipedia>Mr. Stradivarius 0 try without the frame stuff Scribunto text/plain local p = {} function p.main() local title = mw.title.getCurrentTitle() local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end return result end return p 8c153aaa432ab5ba747f6ca8b1dafc3875a39377 165 164 2013-06-17T08:03:29Z wikipedia>Mr. Stradivarius 0 forgot the namespace text Scribunto text/plain local p = {} function p.main() local title = mw.title.getCurrentTitle() local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end return title.nsText .. result end return p 4757bec19f1c07aea686c9a7a13b7e807194fceb 166 165 2013-06-17T08:13:20Z wikipedia>Mr. Stradivarius 0 try using callParserFunction again Scribunto text/plain local p = {} function p.main() local title = mw.title.getCurrentTitle() local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 3f5e354cf4e042e9a8295f3b62c8d62c08b86f36 Module:Italic title 828 6 167 166 2013-06-17T08:21:40Z wikipedia>Mr. Stradivarius 0 add comments Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main() local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p f4ab2536cd15a4a0c3743d154efdf162bd8ed2e5 168 167 2013-06-17T08:24:29Z wikipedia>Mr. Stradivarius 0 Protected Module:Italic title: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main() local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p f4ab2536cd15a4a0c3743d154efdf162bd8ed2e5 169 168 2013-06-17T09:47:09Z wikipedia>Mr. Stradivarius 0 match the start of the string as well Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main() local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p b5a605d0a8c723dbb55a2a94d1543118ad012985 170 169 2013-06-17T10:01:18Z wikipedia>Mr. Stradivarius 0 add support for all=yes Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) -- Process the arguments. if frame == mw.getCurrentFrame() then local args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 6db4f427897ba054cdbffb6130845038cb6f0c88 171 170 2013-06-17T10:02:30Z wikipedia>Mr. Stradivarius 0 Undid revision 560274954 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) ok, something went wrong there Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main() local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p b5a605d0a8c723dbb55a2a94d1543118ad012985 172 171 2013-06-17T10:08:30Z wikipedia>Mr. Stradivarius 0 re-add all=yes - I made a mistake with the args logic Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) -- Process the arguments. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation brackets, if any. local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If brackets were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and brackets and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. brackets else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 301583e6d397a7cadab2c8a897de5e8ab44ff897 173 172 2013-09-04T09:09:41Z wikipedia>Mr. Stradivarius 0 change "brackets" to "parentheses" per protected edit request Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) -- Process the arguments. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation parentheses, if any. local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If parentheses were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and parentheses and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. parentheses else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 0e237db42944fe60903ba0c2dc4a982a8cf10875 Module:Namespace detect 828 25 842 2013-06-24T09:08:02Z wikipedia>Mr. Stradivarius 0 create replacement for [[Template:Namespace detect]] Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then ret = args[cfg.demospace] else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == '' and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) -- Check the namespace, and ignore main namespace values. if nsname == namespace and nsname ~= '' then if args[nsname] then return args[nsname] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments. for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return compare() end return p 68abc7d97dc53b3dd9c59fd59a31b4f160968346 843 842 2013-06-24T10:51:23Z wikipedia>Mr. Stradivarius 0 new function for creating a table of possible input parameters, a couple of portability fixes Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then ret = args[cfg.demospace] else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then if args[nsname] then return args[nsname] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments. for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 114748ed62e286cc21e3d7b2a650b91848a6d76b 844 843 2013-06-24T11:54:45Z wikipedia>Mr. Stradivarius 0 add support for canonical namespace names Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then ret = args[cfg.demospace] else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments. for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 953ec6f248df0d10b1da5e43ddfbcad2cef11e1e 845 844 2013-06-24T11:57:10Z wikipedia>Mr. Stradivarius 0 add a comment Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then ret = args[cfg.demospace] else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments. for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p cdd2b608141ef70f78636aa8405a19eb809ec46f 846 845 2013-06-24T12:24:49Z wikipedia>Mr. Stradivarius 0 handle "demospace = main" properly Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments. for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p d34be2e7bef7b6c03a9d2e16b228a097fb307f79 847 846 2013-06-24T12:38:12Z wikipedia>Mr. Stradivarius 0 fix blank argument bug Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments for demospace and page parameters. for k, v in pairs(origArgs) do if ( k == cfg.demospace or k == cfg.page ) and v ~= '' then args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 8d3c21279a503993439a411895b18c379262c31b 848 847 2013-06-24T12:40:15Z wikipedia>Mr. Stradivarius 0 ok, this should actually work Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Remove blank arguments for demospace and page parameters. for k, v in pairs(origArgs) do if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p a1f61d12c874cc7d98baba7c07732dcd59c7ed60 849 848 2013-06-24T12:51:51Z wikipedia>Mr. Stradivarius 0 trim whitespace, just in case, tweak frame code comment Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return the appropriate parameter. local function compare() local namespace = getNamespace() -- First, return arguments for mainspace. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, return arguments for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Then, return arguments for other namespaces, if the main -- namespace wasn't specified, or if the demospace parameter -- is set to "other". if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p da1741dd7fcb7fce6c07df1ec05ff217eb66e889 850 849 2013-06-24T13:14:40Z wikipedia>Mr. Stradivarius 0 better comments Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare() local namespace = getNamespace() -- First, compare mainspace parameters. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, compare parameters for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Finally, return parameters for other namespaces. This happens if -- there was no text specified for the namespace that was detected -- or if the demospace parameter is not a valid namespace. Note that -- the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 00a3ec74e8ec72c5518a4eafec0f424ad244c44f 851 850 2013-06-24T13:56:32Z wikipedia>Mr. Stradivarius 0 properly handle bad titles and pages exceeding the expensive function limit Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else -- If pageObject is nil, we are either over the expensive -- function limit, or the page title is invalid. In both of -- these cases {{NAMESPACE}} defaults to the blank string, so -- we should do so too. ret = '' end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare() local namespace = getNamespace() -- First, compare mainspace parameters. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, compare parameters for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Finally, return parameters for other namespaces. This happens if -- there was no text specified for the namespace that was detected -- or if the demospace parameter is not a valid namespace. Note that -- the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p ce562339b033034a0e419371ffbb2d89615a30f7 852 851 2013-06-24T14:10:40Z wikipedia>Mr. Stradivarius 0 undo - on second thoughts, these failure modes are pretty arbitrary (bad titles actually default to "talk"), so changing them to both default to "other" is probably for the best Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare() local namespace = getNamespace() -- First, compare mainspace parameters. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, compare parameters for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Finally, return parameters for other namespaces. This happens if -- there was no text specified for the namespace that was detected -- or if the demospace parameter is not a valid namespace. Note that -- the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 00a3ec74e8ec72c5518a4eafec0f424ad244c44f 853 852 2013-06-24T14:20:43Z wikipedia>Mr. Stradivarius 0 Protected Module:Namespace detect: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Specify variables available to the whole module local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Detects the namespace for a page object. local function detectNamespace(pageObject) if pageObject.isTalkPage then -- Returns the value of cfg.talk or the local "Talk" namespace name. return cfg.talk or mw.site.namespaces[1].name else return pageObject.nsText end end -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace() local ret if args[cfg.demospace] then -- Handle "demospace = main" properly. if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then ret = mw.site.namespaces[0].name else ret = args[cfg.demospace] end else local pageObject = getPageObject() if pageObject then ret = detectNamespace( getPageObject() ) else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare() local namespace = getNamespace() -- First, compare mainspace parameters. if namespace == mw.site.namespaces[0].name and args[cfg.main] then return args[cfg.main] end -- Next, compare parameters for non-main namespaces. for nsid, ns in pairs( mw.site.namespaces ) do local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) -- Check the namespace, and ignore main namespace values. if nsid ~= 0 and nsname == namespace then -- Check local namespace name. if args[nsname] then return args[nsname] -- Check canonical namespace name. elseif args[canonicalName] then return args[canonicalName] else -- Check alias names. for _, alias in ipairs( ns.aliases ) do local aliasArg = args[ mw.ustring.lower( alias ) ] if aliasArg then return aliasArg end end end end end -- Finally, return parameters for other namespaces. This happens if -- there was no text specified for the namespace that was detected -- or if the demospace parameter is not a valid namespace. Note that -- the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare() end -- Create a wikitable of all possible namespace parameters. function p.table() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace. ret = ret .. '\n|-' .. '\n| ' .. cfg.main .. '\n|' -- Generate the other wikitable rows. for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg. local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>' local aliases = {} if ns.canonicalName ~= ns.name then table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' ) end for _, v in ipairs( ns.aliases ) do table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' ) end ret = ret .. '\n|-' .. '\n| ' .. name .. '\n| ' .. table.concat( aliases, ', ' ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 00a3ec74e8ec72c5518a4eafec0f424ad244c44f 854 853 2013-07-01T11:01:43Z wikipedia>Mr. Stradivarius 0 make some of the functions public for use in [[Module:Category handler]], redo compare() code, use local variables instead of globals where possible Scribunto text/plain ---------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. Function names -- -- can be configured for different wikis by altering the -- -- values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces -- (namespaces for which parameters have not been specified, or for when -- cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the -- list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from other Lua modules called using -- -- require(). -- ---------------------------------------------------------------------- -- Declare the table of functions to return. local p = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. function p.getPageObject( page ) -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if page then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, page) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: [''] = { {'main'}, }, ['wikipedia'] = { {'wikipedia', 'project', 'wp' } } ]] function p.getParamMappings() local mappings = {} mappings[mw.ustring.lower( mw.site.namespaces[0].name )] = { cfg.main } mappings[cfg.talk] = { cfg.talk } for nsid, ns in pairs( mw.site.subjectNamespaces ) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower( ns.name ) local canonicalName = mw.ustring.lower( ns.canonicalName ) mappings[nsname] = { nsname } if canonicalName ~= nsname then table.insert( mappings[nsname], canonicalName ) end for _, alias in ipairs( ns.aliases ) do table.insert( mappings[nsname], mw.ustring.lower( alias ) ) end end end return mappings end --[[ Create a wikitable of all subject namespace parameters, for documentation purposes. Talk is excluded, as it should usually be treated separately in the documentation. ]] function p.table() -- Get the parameter mappings. local mappings = p.getParamMappings() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace, as we want this -- to be first in the list. ret = ret .. '\n|-' .. '\n| <code>' .. cfg.main .. '</code>' .. '\n|' -- Enclose all parameter names in <code> tags. for ns, params in pairs( mappings ) do if ns ~= mw.site.namespaces[0].name then for i, param in ipairs( params ) do mappings[ns][i] = '<code>' .. param .. '</code>' end end end -- Generate the other wikitable rows. for ns, params in pairs( mappings ) do if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. ret = ret .. '\n|-' .. '\n| ' .. params[1] .. '\n| ' .. table.concat( params, ', ', 2 ) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Gets the namespace name to compare to the arguments. The returned value -- is lower-case. local function getNamespace( page, demospace ) local ret if demospace then -- Handle "demospace = main" properly. if mw.ustring.lower( demospace ) == cfg.main then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject( page ) if pageObject then if pageObject.isTalkPage then -- {{namespace detect}} uses the same value for all talk -- namespaces, so that's what the module should do too. ret = cfg.talk else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been -- specified, and return content of the appropriate parameter. local function compare( args ) -- Get the namespace to compare the parameters to, and the parameter -- mapping table. local namespace = getNamespace( args[cfg.page], args[cfg.demospace] ) local mappings = p.getParamMappings() -- Check for any matches in the namespace arguments. The order we check -- them doesn't matter, as there can only be one match. for ns, params in pairs( mappings ) do if ns == namespace then -- Check all aliases for matches. The default local namespace is -- checked first, as {{namespace detect}} checked these before -- alias names. for _, param in ipairs( params ) do if args[param] then return args[param] end end end end -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid namespace. -- Note that the parameter for the detected namespace must be completely -- absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end ---------------------------------------------------------------------- -- Main function -- -- This is the function that will be most used. It processes -- -- the arguments and calls the compare() function. It is -- -- global, but is put down here as it depends on the other -- -- local in order for it to work. -- ---------------------------------------------------------------------- function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and -- page parameters. local args = {} for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return compare(args) end return p a19894af26ea65654ba89c20428ddaf1d619b3b9 Module:Category handler 828 19 753 2013-06-25T09:13:19Z wikipedia>Mr. Stradivarius 0 start a replacement for [[Template:Category handler]] Scribunto text/plain local basepageSubpage = require('Module:Basepage subpage').main -- Configuration data. local cfg = {} cfg.nocat = 'nocat' cfg.categories = 'categories' cfg.subpage = 'subpage' cfg.page = 'page' cfg.category2 = 'category2' cfg.all = 'all' cfg.main = 'main' cfg.other = 'other' -- Module start. local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Find whether we need to return a category or not. local function needsCategory( pageObject ) if not pageObject then return end if args[cfg.nocat] == 'true' or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' ) or ( args[cfg.subpage] == 'no' and pageObject.isSubpage ) or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck() if args[cfg.nocat] == 'false' or args[cfg.categories] == 'yes' or args[cfg.category2] == 'yes' then return false else return true end end local function _main() local pageObject = getPageObject() if not needsCategory( pageObject ) then return end return needsBlacklistCheck() end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- The following don't need blank values preserved: -- nocat -- categories -- subpage -- page -- positional parameters (1-10) -- The following *do* need blank values preserved -- category2 -- all -- other -- main -- all the namespace parameters -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main() end return p a21efdeb81b74eb379ad6f39a49c3b95969abc61 754 753 2013-06-25T10:39:10Z wikipedia>Mr. Stradivarius 0 add blacklist check Scribunto text/plain -- Configuration data. local cfg = {} cfg.nocat = 'nocat' cfg.categories = 'categories' cfg.subpage = 'subpage' cfg.page = 'page' cfg.category2 = 'category2' cfg.all = 'all' cfg.main = 'main' cfg.other = 'other' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless the appropriate options are set. -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- Module start. local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Find whether we need to return a category or not. local function needsCategory( pageObject ) if not pageObject then return end if args[cfg.nocat] == 'true' or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' ) or ( args[cfg.subpage] == 'no' and pageObject.isSubpage ) or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck() if args[cfg.nocat] == 'false' or args[cfg.categories] == 'yes' or args[cfg.category2] == 'yes' then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch(pageObject) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end local function _main() local pageObject = getPageObject() if not needsCategory( pageObject ) then return end if needsBlacklistCheck() then return findBlacklistMatch( pageObject ) end end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- The following don't need blank values preserved: -- nocat -- categories -- subpage -- page -- positional parameters (1-10) -- The following *do* need blank values preserved -- category2 -- all -- other -- main -- all the namespace parameters -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main() end return p 54e4e5b09744d4f3a78d7738056bdb3825d901c6 755 754 2013-07-01T09:36:56Z wikipedia>Mr. Stradivarius 0 add the rest of the features, improve the comments Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. cfg.categories = 'categories' cfg.categoriesYes = 'yes' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes. cfg.category2 = 'category2' cfg.category2Yes = 'yes' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless the appropriate options are set. -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. cfg.defaultNamespaces = { 0, -- Main 6, -- File 12, -- Help 14 -- Category } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get dependent modules and declare the table of functions that we will -- return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so choose the best -- default for being over the expensive function limit, i.e. categorise the page. if not pageObject then return true end -- Only categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes ) or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage ) or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject() local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. local ndargs = {} for _, nsid in ipairs( cfg.defaultNamespaces ) do ndargs[ mw.ustring.lower( mw.site.namespaces[ nsid ].name ) ] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p e1ecc22454c5303576a4bcaf683f7dbca1d4688c 756 755 2013-07-01T11:36:15Z wikipedia>Mr. Stradivarius 0 pass through page parameter to [[Module:Namespace detect]], tweak comments a bit Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. cfg.categories = 'categories' cfg.categoriesYes = 'yes' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes. cfg.category2 = 'category2' cfg.category2Yes = 'yes' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. cfg.defaultNamespaces = { 0, -- Main 6, -- File 12, -- Help 14 -- Category } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get dependent modules and declare the table of functions that we will -- return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so choose the best -- default for being over the expensive function limit, i.e. categorise the page. if not pageObject then return true end -- Only categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes ) or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage ) or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. local ndargs = {} for _, nsid in ipairs( cfg.defaultNamespaces ) do ndargs[ mw.ustring.lower( mw.site.namespaces[ nsid ].name ) ] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p 2beb9800e7361f82ed40cc9d17e88d7fee896355 757 756 2013-07-01T12:01:45Z wikipedia>Mr. Stradivarius 0 fix default parameter main namespace bug Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. cfg.categories = 'categories' cfg.categoriesYes = 'yes' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes. cfg.category2 = 'category2' cfg.category2Yes = 'yes' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They -- should be in the format of parameter names accepted by -- [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get dependent modules and declare the table of functions that we will -- return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so choose the best -- default for being over the expensive function limit, i.e. categorise the page. if not pageObject then return true end -- Only categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes ) or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage ) or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs( cfg.defaultNamespaces ) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p fa708b634aea7729ebfa6888b159882a7b38518e 758 757 2013-07-01T12:26:30Z wikipedia>Mr. Stradivarius 0 fix blacklist-checking bug Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. cfg.categories = 'categories' cfg.categoriesYes = 'yes' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes. cfg.category2 = 'category2' cfg.category2Yes = 'yes' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They -- should be in the format of parameter names accepted by -- [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get dependent modules and declare the table of functions that we will -- return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so choose the best -- default for being over the expensive function limit, i.e. categorise the page. if not pageObject then return true end -- Only categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes ) or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage ) or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. -- Check blacklist if necessary. if not needsBlacklistCheck( args ) or not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs( cfg.defaultNamespaces ) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p 33911d2f9383ab4e2477e9b43b7fe1c3fa46536d 759 758 2013-07-01T12:39:33Z wikipedia>Mr. Stradivarius 0 add support for "categories=no" and "category2=¬" Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if set to the cfg.categoriesNo value. cfg.categories = 'categories' cfg.categoriesYes = 'yes' cfg.categoriesNo = 'no' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They -- should be in the format of parameter names accepted by -- [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get dependent modules and declare the table of functions that we will -- return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so choose the best -- default for being over the expensive function limit, i.e. categorise the page. if not pageObject then return true end -- Only categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or args[cfg.categories] == cfg.categoriesNo or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage ) or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. -- Check blacklist if necessary. if not needsBlacklistCheck( args ) or not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs( cfg.defaultNamespaces ) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p 6dd0c7594b4ec9b2937d89092d0b0a179f75b2c7 760 759 2013-07-01T13:16:12Z wikipedia>Mr. Stradivarius 0 better fallback behaviour if we are over the expensive function count Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if set to the cfg.categoriesNo value. cfg.categories = 'categories' cfg.categoriesYes = 'yes' cfg.categoriesNo = 'no' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They -- should be in the format of parameter names accepted by -- [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get [[Module:Namespace detect]] and declare the table of functions -- that we will return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- Don't categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or args[cfg.categories] == cfg.categoriesNo or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage) ) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. -- Check blacklist if necessary. if not needsBlacklistCheck( args ) or not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs( cfg.defaultNamespaces ) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p d213967f4f0b56bfba82d27995fc1191f7f687d6 761 760 2013-08-01T14:34:28Z wikipedia>Mr. Stradivarius 0 tweak blacklist - on matching subpages, don't match "basepage/", only "basepage/foo" Scribunto text/plain ---------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template -- -- in Lua, with a few improvements: all namespaces and all -- -- namespace aliases are supported, and namespace names are -- -- detected automatically for the local wiki. This module -- -- requires [[Module:Namespace detect]] to be available on -- -- the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------- ---------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set -- -- here. -- ---------------------------------------------------------------------- local cfg = {} -- cfg.nocat is the parameter name to suppress categorisation. -- cfg.nocatTrue is the value to suppress categorisation, and -- cfg.nocatFalse is the value to both categorise and to skip the -- blacklist check. cfg.nocat = 'nocat' cfg.nocatTrue = 'true' cfg.nocatFalse = 'false' -- The parameter name for the legacy "categories" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if set to the cfg.categoriesNo value. cfg.categories = 'categories' cfg.categoriesYes = 'yes' cfg.categoriesNo = 'no' -- The parameter name for the legacy "category2" parameter. This -- skips the blacklist if set to the cfg.category2Yes value, and -- suppresses categorisation if present but equal to anything other -- than cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on -- subpages. cfg.subpageNo is the value to specify to not -- categorise on subpages; cfg.only is the value to specify to only -- categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for -- the namespace that is detected. This must be the same as the -- cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current -- page; used for testing and demonstration. This must be the same -- as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this -- list will not be categorised unless any of the following options are -- set: "nocat=false", "categories=yes", or "category2=yes". -- If the namespace name has a space in, it must be written with an -- underscore, e.g. "Wikipedia_talk". Other parts of the title can have -- either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They -- should be in the format of parameter names accepted by -- [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------- -- Get [[Module:Namespace detect]] and declare the table of functions -- that we will return. local NamespaceDetect = require('Module:Namespace detect') local p = {} ---------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want -- -- to be accessible from other modules. -- ---------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory( pageObject, args ) -- Don't categorise if the relevant options are set. if args[cfg.nocat] == cfg.nocatTrue or args[cfg.categories] == cfg.categoriesNo or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage) ) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck( args ) if args[cfg.nocat] == cfg.nocatFalse or args[cfg.categories] == cfg.categoriesYes or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Searches the blacklist to find a match with the page object. The -- string searched is the namespace plus the title, including subpages. -- Returns true if there is a match, otherwise returns false. local function findBlacklistMatch( pageObject ) if not pageObject then return end -- Get the title to check. local title = pageObject.nsText -- Get the namespace. -- Append a colon if the namespace isn't the blank string. if #title > 0 then title = title .. ':' .. pageObject.text else title = pageObject.text end -- Check the blacklist. for i, pattern in ipairs( cfg.blacklist ) do if mw.ustring.match( title, pattern ) then return true end end return false end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist( mappings, args ) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs( mappings ) do for i, param in ipairs( params ) do if args[param] then return true end end end return false end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. local function _main( args ) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = NamespaceDetect.getPageObject( args[cfg.page] ) local mappings = NamespaceDetect.getParamMappings() -- Check if we need a category or not, and return nothing if not. if not needsCategory( pageObject, args ) then return end local ret = '' -- The string to return. -- Check blacklist if necessary. if not needsBlacklistCheck( args ) or not findBlacklistMatch( pageObject ) then if not nsParamsExist( mappings, args ) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs( cfg.defaultNamespaces ) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = NamespaceDetect.main( ndargs ) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs( mappings ) do for _, param in ipairs( params ) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = NamespaceDetect.main( ndargs ) -- Work out what to return based on the result of the namespace -- detect call. local datanum = tonumber( data ) if type( datanum ) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor( datanum ) == datanum and args[datanum] then ret = ret .. args[ datanum ] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end ---------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them -- -- to be accessible from #invoke and from other Lua modules. -- -- At the moment only the main function is here. It processes -- -- the arguments and passes them to the _main function. -- ---------------------------------------------------------------------- function p.main( frame ) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs( origArgs ) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main( args ) end return p 862a1f72394bd8f817dddd1b9766b62f387d0c60 762 761 2013-09-26T12:50:02Z wikipedia>Mr. Stradivarius 0 update to use [[Module:Yesno]] and to allow it to play nicely with other Lua modules Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = 'Ê' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = nsDetect.main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = nsDetect.main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum and args[datanum] then ret = ret .. args[datanum] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 597e094398f459517bdbebc24689fb5fc867e0fa 763 762 2013-09-26T12:54:27Z wikipedia>Mr. Stradivarius 0 hmm, looks like the computer I was editing this on doesn't like the negation symbol Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page local ndresult = nsDetect.main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. if args.all then ret = ret .. args.all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end if args.other then ndargs.other = args.other end if args.page then ndargs.page = args.page end local data = nsDetect.main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum and args[datanum] then ret = ret .. args[datanum] end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p bdb9171f05b12045a9851e2c6d917a9ebcfd6b40 Module:Infobox 828 10 320 319 2013-07-11T14:33:35Z wikipedia>Mr. Stradivarius 0 remove extra newline from the below row, use a div tag instead of a span tag for image captions, per talk Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label', 'rowclass'}}, {prefix = 'class'} }, 50) preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 4969895891cb54927afaf12c25c5ab394cc58a98 321 320 2013-08-11T03:32:04Z wikipedia>Mr. Stradivarius 0 make rowclass apply to headers as well as data cells, per protected edit request Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .addClass(rowArgs.rowclass) .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 3cd7d08882323e6ed6ff690049c9ead888f7eed5 Module:Navbar 828 8 246 245 2013-09-03T13:47:09Z wikipedia>Anomie 0 Let's not assume the error is because of the expensive function limit, it could be something else. Especially for people who import this module into MW 1.21 installations. Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function getTitle( pageName ) pageName = trim( pageName ); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); else page_title = mw.title.new( pageName, 'Template' ); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function _navbar( args ) if not args[1] then return error('No name provided') end local good, title, talk_title; good, title, talk_title = pcall( getTitle, args[1] ); if not good then return error(title); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'noprint' ) .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p f6146c27e94e0b0c5b9ac1769c1e53306a71949c Module:Message box 828 4 56 2013-09-19T12:37:26Z wikipedia>Mr. Stradivarius 0 start work on a module for displaying [[Template:Mbox]]-family message boxes Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local p = {} function p.build(data, args) -- Process config data using the args passed to the template. local isSmall = args.small == 'yes' or args.small == true local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Build the box. local root = htmlBuilder.create() -- The template root. Includes error messages and categories added after the box. local box = root.tag('table') -- The box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') if args.image ~= 'none' then row.tag('td') .addClass('mbox-image') .wikitext(args.image or mw.ustring.format( '[[File:%s|%s|link=|alt=]]', typeData.image, (args.small == 'yes' or args.small == true) and data.imageSizeSmall or data.imageSizeLarge or data.imageSize )) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.text) -- Add the right-hand image. if args.imageright then row.tag('td') .addClass('mbox-imageright') .wikitext(args.imageright) end -- Add error messages and categories. if invalidType then local title = mw.title.getCurrentTitle() local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText root.tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end return tostring(root) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageSize = '40x40px' data.imageEmptyCell = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.imageSizeLarge = '40x40px' data.imageSizeSmall = '30x30px' data.imageEmptyCell = true return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.fmbox = makeWrapper(p._fmbox) p.ombox = makeWrapper(p._ombox) return p 2ea971f1895d9d598ff3a749f10f5250d5f3eedb 57 56 2013-09-19T14:27:10Z wikipedia>Mr. Stradivarius 0 more abstraction for box structure and better small=yes support Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local p = {} local function generateBoxStructure() local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local box = root.tag('table') local row = box.tag('tr') return root, box, row end function p.build(data, args) -- Process config data. local isSmall = args.small == 'yes' or args.small == true local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] local image, imageRight, text, imageSize if isSmall then image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or args.text imageSize = data.imageSizeSmall or data.imageSize else image = args.image imageRight = args.imageright text = args.text imageSize = data.imageSizeLarge or data.imageSize end -- Get the box structure. local root, box, row = generateBoxStructure() -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. if image ~= 'none' then row.tag('td') .addClass('mbox-image') .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(text) -- Add the right-hand image. if imageRight then row.tag('td') .addClass('mbox-imageright') .wikitext(imageRight) end -- Add error messages and categories. if invalidType then local title = mw.title.getCurrentTitle() local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText root.tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end return tostring(root) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageSize = '40x40px' data.imageEmptyCell = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.imageSizeLarge = '40x40px' data.imageSizeSmall = '30x30px' data.imageEmptyCell = true return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.fmbox = makeWrapper(p._fmbox) p.ombox = makeWrapper(p._ombox) return p a7769a8836acce0a6cc7e578998b3fd299b0ac96 58 57 2013-09-21T01:56:29Z wikipedia>Mr. Stradivarius 0 add imbox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local yesno = require('Module:Yesno') local p = {} local function generateBoxStructure() local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local box = root.tag('table') local row = box.tag('tr') return root, box, row end function p.build(data, args) -- Process config data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] local isSmall = (args.small == 'yes' or args.small == true) and true or false local image, imageRight, text, imageSize if isSmall then image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or args.text imageSize = data.imageSizeSmall or data.imageSize or '40x40px' else image = args.image imageRight = args.imageright text = args.text imageSize = data.imageSizeLarge or data.imageSize or '40x40px' end -- Get the box structure. local root, box, row = generateBoxStructure() -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and 'mbox-small') .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. if image ~= 'none' then row.tag('td') .addClass('mbox-image') .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(text) -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then row.tag('td') .addClass('mbox-imageright') .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end -- Add error messages and categories. if invalidType then local title = mw.title.getCurrentTitle() local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText root.tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end return tostring(root) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.imageSizeLarge = '40x40px' data.imageSizeSmall = '30x30px' data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) return p 78fea44eba0d9f88b13263483f03dff8b8add56c 59 58 2013-09-21T03:20:52Z wikipedia>Mr. Stradivarius 0 add cmbox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local yesno = require('Module:Yesno') local p = {} local function generateBoxStructure() local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local box = root.tag('table') local row = box.tag('tr') return root, box, row end function p.build(data, args) -- Process config data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] local isSmall = (args.small == 'yes' or args.small == true) and true or false local image, imageRight, text, imageSize if isSmall then image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or args.text imageSize = data.imageSizeSmall or data.imageSize or '40x40px' else image = args.image imageRight = args.imageright text = args.text imageSize = data.imageSizeLarge or data.imageSize or '40x40px' end -- Get the box structure. local root, box, row = generateBoxStructure() -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and 'mbox-small') .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. if image ~= 'none' then row.tag('td') .addClass('mbox-image') .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(text) -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then row.tag('td') .addClass('mbox-imageright') .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end -- Add error messages and categories. if invalidType then local title = mw.title.getCurrentTitle() local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText root.tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end return tostring(root) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.imageSizeLarge = '40x40px' data.imageSizeSmall = '30x30px' data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end function p._cmbox(args) local data = {} data.types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'cmbox'} return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) p.cmbox = makeWrapper(p._cmbox) return p 09a6548f8dbbbdd4890ee744fe240c569b883941 60 59 2013-09-21T10:39:36Z wikipedia>Mr. Stradivarius 0 add tmbox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page or mw.title.getCurrentTitle() end local function generateBoxStructure() local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local box = root.tag('table') local row = box.tag('tr') return root, box, row end function p.build(data, args) -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] -- Process config data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local image, imageRight, text, imageSize if isSmall then image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or args.text imageSize = '30x30px' else image = args.image imageRight = args.imageright text = args.text imageSize = '40x40px' end -- Get the box structure. local root, box, row = generateBoxStructure() -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and 'mbox-small') .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. if image ~= 'none' then row.tag('td') .addClass('mbox-image') .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(text) -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then row.tag('td') .addClass('mbox-imageright') .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end -- Add error messages and tracking categories. if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText root .tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end -- Categorise template pages. if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then root.wikitext(mw.ustring.format('[[Category:%s]]', data.category)) end return tostring(root) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.allowSmall = true data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end function p._cmbox(args) local data = {} data.types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'cmbox'} return p.build(data, args) end function p._tmbox(args) local data = {} data.types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'tmbox'} data.allowSmall = true data.imageRightNone = true data.imageEmptyCellStyle = true data.category = 'Talk message boxes' return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) p.cmbox = makeWrapper(p._cmbox) p.tmbox = makeWrapper(p._tmbox) return p 02d29e97d8215fb5803bbb02a39402c8cb20d8a2 61 60 2013-09-21T14:45:45Z wikipedia>Mr. Stradivarius 0 initial code for ambox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page or mw.title.getCurrentTitle() end local function generateBoxStructure() local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local substCheck = root.tag('b').addClass('error') local box = root.tag('table') local row = box.tag('tr') local imageLeftCell = row.tag('td') return root, substCheck, box, row, imageLeftCell end function p.build(data, args) -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] -- Process config data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or args.text imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright text = args.text imageSize = '40x40px' end -- Get the box structure. local root, substCheck, box, row, imageLeftCell = generateBoxStructure() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(args.name) == 'string' then substCheck .wikitext(mw.ustring.format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), args.name, mw.text.nowiki('}}') )) end root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message. end -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then imageLeftCell .addClass('mbox-image') if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. row.tag('td') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(text) -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then row.tag('td') .addClass('mbox-imageright') .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end -- Add error messages and tracking categories. if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText root .tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end -- Categorise template pages. if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then root.wikitext(mw.ustring.format('[[Category:%s]]', data.category)) end return tostring(root) end function p._ambox(args) local data = {} data.types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } } data.default = 'notice' data.allowSmall = true data.substCheck = true data.classes = {'metadata', 'plainlinks', 'ambox'} data.smallClass = 'mbox-small-left' data.imageEmptyCell = true data.imageCheckBlank = true data.imageSmallSize = '20x20px' data.imageCellDiv = true data.talkLink = true return p.build(data, args) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.allowSmall = true data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end function p._cmbox(args) local data = {} data.types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'cmbox'} return p.build(data, args) end function p._tmbox(args) local data = {} data.types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'tmbox'} data.allowSmall = true data.imageRightNone = true data.imageEmptyCellStyle = true data.category = 'Talk message boxes' return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' then args[k] = v end end return func(args) end end p.ambox = makeWrapper(p._ambox) p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) p.cmbox = makeWrapper(p._cmbox) p.tmbox = makeWrapper(p._tmbox) return p 006271527a5b1792fbd786525c24fc73b68b10fb 62 61 2013-09-23T06:38:52Z wikipedia>Mr. Stradivarius 0 more ambox stuff - still a little broken Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page or mw.title.getCurrentTitle() end function p.build(data, args) -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local text, talk, fix, date, info if data.useCollapsibleTextFields then text = args.issue talk = args.talk fix = args.fix date = args.date info = args.info else text = args.text end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright text = args.smalltext or text imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' end ------------------------ Get the box structure ---------------------------- local root = htmlBuilder.create() -- Includes error messages and categories added after the box. local substCheck = root.tag('b').addClass('error') local box = root.tag('table') local row = box.tag('tr') local imageLeftCell = row.tag('td').addClass('mbox-image') local textCell = row.tag('td').addClass('mbox-text') local imageRightCell = row.tag('td').addClass('mbox-imageright') ------------------------ Build the box ---------------------------- -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(args.name) == 'string' then substCheck .wikitext(mw.ustring.format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), args.name, mw.text.nowiki('}}') )) end root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message. end -- Build the box. box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(text) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(fix) .done() end textCellSpan .wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Add error messages and categories ---------------------------- -- Add error message and tracking category for invalid type parameters. if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText root .tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end -- Categorise template pages. if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then root.wikitext(mw.ustring.format('[[Category:%s]]', data.category)) end return tostring(root) end function p._ambox(args) local data = {} data.types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } } data.default = 'notice' data.allowSmall = true data.substCheck = true data.classes = {'metadata', 'plainlinks', 'ambox'} data.smallClass = 'mbox-small-left' data.imageEmptyCell = true data.imageCheckBlank = true data.imageSmallSize = '20x20px' data.imageCellDiv = true data.useCollapsibleTextFields = true data.imageRightNone = true return p.build(data, args) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.allowSmall = true data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end function p._cmbox(args) local data = {} data.types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'cmbox'} return p.build(data, args) end function p._tmbox(args) local data = {} data.types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'tmbox'} data.allowSmall = true data.imageRightNone = true data.imageEmptyCellStyle = true data.category = 'Talk message boxes' return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then args[k] = v end end return func(args) end end p.ambox = makeWrapper(p._ambox) p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) p.cmbox = makeWrapper(p._cmbox) p.tmbox = makeWrapper(p._tmbox) return p 1eece6f64b88ea09bf07e770c90fe0121100aef9 63 62 2013-09-23T14:14:26Z wikipedia>Mr. Stradivarius 0 Fixed a few of the ambox bugs. Still have to add category support. Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end function p.build(data, args) -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Get a language object for formatDate. local lang = mw.language.getContentLanguage() -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local name, issue, talk, fix, date, info if data.useCollapsibleTextFields then name = args.name local nameTitle = getTitleObject(name) local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false local sect = args.sect if presentButBlank(sect) then sect = 'This article ' elseif type(sect) == 'string' then sect = 'This ' .. sect .. ' ' end issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '') talk = args.talk if presentButBlank(talk) and isTemplatePage then talk = '#' end fix = args.fix date = args.date if presentButBlank(date) and isTemplatePage then date = lang:formatDate('F Y') end info = args.info end -- Process the talk link, if present. if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = type(talk) == 'string' and getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = ' Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end talk = talkText end end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright if data.useCollapsibleTextFields then text = args.smalltext or issue else text = args.smalltext or args.text end imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' text = args.text end ------------------------ Build the box ---------------------------- local root = htmlBuilder.create() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(args.name) == 'string' then root .tag('b') .addClass('error') .wikitext(mw.ustring.format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), args.name, mw.text.nowiki('}}') )) end root.wikitext('[[Category:Pages with incorrectly substituted templates]]') end -- Build the box. local box = root.tag('table') box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') local imageLeftCell = row.tag('td').addClass('mbox-image') local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(' ') .wikitext(fix) .done() end textCellSpan .wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. local imageRightCell = row.tag('td').addClass('mbox-imageright') if imageRight and not (data.imageRightNone and imageRight == 'none') then if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Add error messages and categories ---------------------------- -- Add error message and tracking category for invalid type parameters. if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText root .tag('div') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) .done() .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end -- Categorise template pages. if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then root.wikitext(mw.ustring.format('[[Category:%s]]', data.category)) end return tostring(root) end function p._ambox(args) local data = {} data.types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } } data.default = 'notice' data.allowSmall = true data.substCheck = true data.classes = {'metadata', 'plainlinks', 'ambox'} data.smallClass = 'mbox-small-left' data.imageEmptyCell = true data.imageCheckBlank = true data.imageSmallSize = '20x20px' data.imageCellDiv = true data.useCollapsibleTextFields = true data.imageRightNone = true return p.build(data, args) end function p._fmbox(args) local data = {} data.types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } } data.default = 'system' data.classes = { 'plainlinks', 'fmbox' } data.imageEmptyCell = false data.imageRightNone = false return p.build(data, args) end function p._ombox(args) local data = {} data.types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'ombox'} data.allowSmall = true data.imageEmptyCell = true data.imageRightNone = true return p.build(data, args) end function p._imbox(args) local data = {} data.types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'imbox'} data.classPlainlinksYesno = true data.imageEmptyCell = true data.below = true return p.build(data, args) end function p._cmbox(args) local data = {} data.types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'cmbox'} return p.build(data, args) end function p._tmbox(args) local data = {} data.types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } } data.default = 'notice' data.classes = {'plainlinks', 'tmbox'} data.allowSmall = true data.imageRightNone = true data.imageEmptyCellStyle = true data.category = 'Talk message boxes' return p.build(data, args) end local function makeWrapper(func) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then args[k] = v end end return func(args) end end p.ambox = makeWrapper(p._ambox) p.fmbox = makeWrapper(p._fmbox) p.imbox = makeWrapper(p._imbox) p.ombox = makeWrapper(p._ombox) p.cmbox = makeWrapper(p._cmbox) p.tmbox = makeWrapper(p._tmbox) return p 0e00e4f843de5b155a5c9e34d15ec8b088f109b9 64 63 2013-09-25T11:58:28Z wikipedia>Mr. Stradivarius 0 finish ambox and split the config functions out to [[Module:Message box/data]] Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function formatCategory(cat, date, all) local ret = {} cat = type(cat) == 'string' and cat date = type(date) == 'string' and date all = type(all) == 'string' and all local preposition = 'from' if cat and date then local catTitle = mw.ustring.format('Category:%s %s %s', cat, preposition, date) table.insert(ret, mw.ustring.format('[[%s]]', catTitle)) catTitle = getTitleObject(catTitle) if not catTitle or not catTitle.exists then table.insert(ret, '[[Category:Articles with invalid date parameter in template]]') end elseif cat and not date then table.insert(ret, mw.ustring.format('[[Category:%s]]', cat)) end if all then table.insert(ret, mw.ustring.format('[[Category:%s]]', all)) end return table.concat(ret) end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end function p.build(boxType, args) -- Get the box config data from the data page. local dataTables = mw.loadData('Module:Message box/data') local data = dataTables[boxType] if not data then local boxTypes = {} for k, v in pairs(dataTables) do table.insert(boxTypes, mw.ustring.format('"%s"', k)) end error(mw.ustring.format('Invalid message box type. Valid types are %s.', mw.text.listToText(boxTypes))) end -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Get a language object for formatDate. local lang = mw.language.getContentLanguage() -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local name, issue, talk, fix, date, info if data.useCollapsibleTextFields then name = args.name local nameTitle = getTitleObject(name) local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false local sect = args.sect if presentButBlank(sect) then sect = mw.ustring.format('This %s ', data.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect .. ' ' end issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '') talk = args.talk if presentButBlank(talk) and isTemplatePage then talk = '#' end fix = args.fix date = args.date if presentButBlank(date) and isTemplatePage then date = lang:formatDate('F Y') end info = args.info end -- Process the talk link, if present. if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = type(talk) == 'string' and getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = ' Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end talk = talkText end end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright if data.useCollapsibleTextFields then text = args.smalltext or issue else text = args.smalltext or args.text end imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' text = args.text end -- Process mainspace categories. local mainCats = {} local origCategoryNums -- origCategoryNums might be used in computing the template error category. if data.allowMainspaceCategories then -- Categories for the main namespace. local origCatNums = getArgNums(args, 'cat') local origCategoryNums = getArgNums(args, 'category') local catNums = union(origCatNums, origCategoryNums) for _, num in ipairs(catNums) do local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local all = args['all' .. tostring(num)] table.insert(mainCats, formatCategory(cat, args.date, all)) end end -- Process template namespace categories local templateCats = {} if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then table.insert(templateCats, mw.ustring.format('[[Category:%s]]', data.templateCategory)) end -- Add an error category for the template namespace if appropriate. if data.templateErrorCategory then local catName = data.templateErrorCategory local templateCat if not name and not title.isSubpage then templateCat = mw.ustring.format('[[Category:%s]]', catName) elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = data.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = mw.ustring.format('[[Category:%s|%d]]', catName, count) end if origCategoryNums and #origCategoryNums > 0 then templateCat = mw.ustring.format('[[Category:%s|C]]', catName) end end table.insert(templateCats, templatecat) end -- Categories for all namespaces. local allCats = {} if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText table.insert(allCats, mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end ------------------------ Build the box ---------------------------- local root = htmlBuilder.create() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(name) == 'string' then root .tag('b') .addClass('error') .wikitext(mw.ustring.format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), name, mw.text.nowiki('}}') )) end table.insert(allCats, '[[Category:Pages with incorrectly substituted templates]]') end -- Create the box table. local box = root.tag('table') box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then local imageLeftCell = row.tag('td').addClass('mbox-image') if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(' ') .wikitext(fix) .done() end textCellSpan .wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Error messages and categories ---------------------------- -- Add error message for invalid type parameters. if invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or '')) end -- Add categories using categoryHandler. root .wikitext(categoryHandler{ main = table.concat(mainCats), template = table.concat(templateCats), all = table.concat(allCats) }) return tostring(root) end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then args[k] = v end end return p.build(boxType, args) end end p.ambox = makeWrapper('ambox') p.fmbox = makeWrapper('fmbox') p.imbox = makeWrapper('imbox') p.ombox = makeWrapper('ombox') p.cmbox = makeWrapper('cmbox') p.tmbox = makeWrapper('tmbox') return p 6c1c5d6ea63846f3e962420c83448be2c3fc79bf 65 64 2013-09-25T12:15:05Z wikipedia>Mr. Stradivarius 0 better error message Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. local htmlBuilder = require('Module:HtmlBuilder') local nsDetect = require('Module:Namespace detect') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success success, page = pcall(mw.title.new, page) if not success then page = nil end end return page end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function formatCategory(cat, date, all) local ret = {} cat = type(cat) == 'string' and cat date = type(date) == 'string' and date all = type(all) == 'string' and all local preposition = 'from' if cat and date then local catTitle = mw.ustring.format('Category:%s %s %s', cat, preposition, date) table.insert(ret, mw.ustring.format('[[%s]]', catTitle)) catTitle = getTitleObject(catTitle) if not catTitle or not catTitle.exists then table.insert(ret, '[[Category:Articles with invalid date parameter in template]]') end elseif cat and not date then table.insert(ret, mw.ustring.format('[[Category:%s]]', cat)) end if all then table.insert(ret, mw.ustring.format('[[Category:%s]]', all)) end return table.concat(ret) end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end function p.build(boxType, args) -- Get the box config data from the data page. local dataTables = mw.loadData('Module:Message box/data') local data = dataTables[boxType] if not data then local boxTypes = {} for k, v in pairs(dataTables) do table.insert(boxTypes, mw.ustring.format('"%s"', k)) end error(mw.ustring.format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end -- Get the title object and the namespace. local title = mw.title.getCurrentTitle() local nsid = title.namespace -- Get a language object for formatDate. local lang = mw.language.getContentLanguage() -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between -- invalid titles and pages where the expensive parser function count has been exceeded. --[[ local title = nsDetect.getPageObject(args.page) local namespace = nsDetect.main{ page = args.page, demospace = args.demospace, main = 'main', talk = 'talk', file = 'file', category = 'category', other = 'other' } ]] ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local name, issue, talk, fix, date, info if data.useCollapsibleTextFields then name = args.name local nameTitle = getTitleObject(name) local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false local sect = args.sect if presentButBlank(sect) then sect = mw.ustring.format('This %s ', data.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect .. ' ' end issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '') talk = args.talk if presentButBlank(talk) and isTemplatePage then talk = '#' end fix = args.fix date = args.date if presentButBlank(date) and isTemplatePage then date = lang:formatDate('F Y') end info = args.info end -- Process the talk link, if present. if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = type(talk) == 'string' and getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = ' Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end talk = talkText end end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright if data.useCollapsibleTextFields then text = args.smalltext or issue else text = args.smalltext or args.text end imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' text = args.text end -- Process mainspace categories. local mainCats = {} local origCategoryNums -- origCategoryNums might be used in computing the template error category. if data.allowMainspaceCategories then -- Categories for the main namespace. local origCatNums = getArgNums(args, 'cat') local origCategoryNums = getArgNums(args, 'category') local catNums = union(origCatNums, origCategoryNums) for _, num in ipairs(catNums) do local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local all = args['all' .. tostring(num)] table.insert(mainCats, formatCategory(cat, args.date, all)) end end -- Process template namespace categories local templateCats = {} if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then table.insert(templateCats, mw.ustring.format('[[Category:%s]]', data.templateCategory)) end -- Add an error category for the template namespace if appropriate. if data.templateErrorCategory then local catName = data.templateErrorCategory local templateCat if not name and not title.isSubpage then templateCat = mw.ustring.format('[[Category:%s]]', catName) elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = data.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = mw.ustring.format('[[Category:%s|%d]]', catName, count) end if origCategoryNums and #origCategoryNums > 0 then templateCat = mw.ustring.format('[[Category:%s|C]]', catName) end end table.insert(templateCats, templatecat) end -- Categories for all namespaces. local allCats = {} if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText table.insert(allCats, mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end ------------------------ Build the box ---------------------------- local root = htmlBuilder.create() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(name) == 'string' then root .tag('b') .addClass('error') .wikitext(mw.ustring.format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), name, mw.text.nowiki('}}') )) end table.insert(allCats, '[[Category:Pages with incorrectly substituted templates]]') end -- Create the box table. local box = root.tag('table') box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then local imageLeftCell = row.tag('td').addClass('mbox-image') if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(' ') .wikitext(fix) .done() end textCellSpan .wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Error messages and categories ---------------------------- -- Add error message for invalid type parameters. if invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(mw.ustring.format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or '')) end -- Add categories using categoryHandler. root .wikitext(categoryHandler{ main = table.concat(mainCats), template = table.concat(templateCats), all = table.concat(allCats) }) return tostring(root) end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then args[k] = v end end return p.build(boxType, args) end end p.ambox = makeWrapper('ambox') p.fmbox = makeWrapper('fmbox') p.imbox = makeWrapper('imbox') p.ombox = makeWrapper('ombox') p.cmbox = makeWrapper('cmbox') p.tmbox = makeWrapper('tmbox') return p a7906d0615a30896bc92b5406a23056ade29891f 66 65 2013-09-26T12:46:29Z wikipedia>Mr. Stradivarius 0 add mbox, various other fixes Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function formatCategory(cat, date, all) local ret = {} cat = type(cat) == 'string' and cat date = type(date) == 'string' and date all = type(all) == 'string' and all local preposition = 'from' if cat and date then local catTitle = format('Category:%s %s %s', cat, preposition, date) tinsert(ret, format('[[%s]]', catTitle)) catTitle = getTitleObject(catTitle) if not catTitle or not catTitle.exists then tinsert(ret, '[[Category:Articles with invalid date parameter in template]]') end elseif cat and not date then tinsert(ret, format('[[Category:%s]]', cat)) end if all then tinsert(ret, format('[[Category:%s]]', all)) end return tconcat(ret) end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end local function getNamespaceId(ns) if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end local function getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function p.build(boxType, args) if type(args) ~= 'table' then error(format('invalid "args" parameter type; expected type "table", got type "%s"', type(args)), 2) end -- Get the title object and the namespace. local title = getTitleObject(args.page) or mw.title.getCurrentTitle() local nsid = getNamespaceId(args.demospace) or title.namespace -- Get the box config data from the data page. if boxType == 'mbox' then boxType = getMboxType(nsid) end local dataTables = mw.loadData('Module:Message box/data') local data = dataTables[boxType] if not data then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local name, issue, talk, fix, date, info if data.useCollapsibleTextFields then name = args.name local nameTitle = getTitleObject(name) local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false local sect = args.sect if presentButBlank(sect) then sect = format('This %s ', data.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect .. ' ' end issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '') talk = args.talk if presentButBlank(talk) and isTemplatePage then talk = '#' end fix = args.fix date = args.date if presentButBlank(date) and isTemplatePage then date = lang:formatDate('F Y') end info = args.info end -- Process the talk link, if present. if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = type(talk) == 'string' and getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = ' Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end talk = talkText end end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright if data.useCollapsibleTextFields then text = args.smalltext or issue else text = args.smalltext or args.text end imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' text = args.text end -- Process mainspace categories. local mainCats = {} local origCategoryNums -- origCategoryNums might be used in computing the template error category. if data.allowMainspaceCategories then -- Categories for the main namespace. local origCatNums = getArgNums(args, 'cat') local origCategoryNums = getArgNums(args, 'category') local catNums = union(origCatNums, origCategoryNums) for _, num in ipairs(catNums) do local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local all = args['all' .. tostring(num)] tinsert(mainCats, formatCategory(cat, args.date, all)) end end -- Process template namespace categories local templateCats = {} if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then tinsert(templateCats, format('[[Category:%s]]', data.templateCategory)) end -- Add an error category for the template namespace if appropriate. if data.templateErrorCategory then local catName = data.templateErrorCategory local templateCat if not name and not title.isSubpage then templateCat = format('[[Category:%s]]', catName) elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = data.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = format('[[Category:%s|%d]]', catName, count) end if origCategoryNums and #origCategoryNums > 0 then templateCat = format('[[Category:%s|C]]', catName) end end tinsert(templateCats, templatecat) end -- Categories for all namespaces. local allCats = {} if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText tinsert(allCats, format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end ------------------------ Build the box ---------------------------- local root = htmlBuilder.create() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(name) == 'string' then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), name, mw.text.nowiki('}}') )) end tinsert(allCats, '[[Category:Pages with incorrectly substituted templates]]') end -- Create the box table. local box = root.tag('table') box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then local imageLeftCell = row.tag('td').addClass('mbox-image') if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(' ') .wikitext(fix) .done() end textCellSpan .wikitext(date and format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Error messages and categories ---------------------------- -- Add error message for invalid type parameters. if invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or '')) end -- Add categories using categoryHandler. root .wikitext(categoryHandler{ main = tconcat(mainCats), template = tconcat(templateCats), all = tconcat(allCats) }) return tostring(root) end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then args[k] = v end end return p.build(boxType, args) end end p.mbox = makeWrapper('mbox') p.ambox = makeWrapper('ambox') p.cmbox = makeWrapper('cmbox') p.fmbox = makeWrapper('fmbox') p.imbox = makeWrapper('imbox') p.ombox = makeWrapper('ombox') p.tmbox = makeWrapper('tmbox') return p 9dd3d3e06be62c085e5d3adbaa62a701a03dda3f 67 66 2013-09-27T13:02:09Z wikipedia>Mr. Stradivarius 0 pass nocat, page, and demospace parameters to [[Module:Category handler]], and add a choice for which arguments to allow as blank Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local p = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function formatCategory(cat, date, all) local ret = {} cat = type(cat) == 'string' and cat date = type(date) == 'string' and date all = type(all) == 'string' and all local preposition = 'from' if cat and date then local catTitle = format('Category:%s %s %s', cat, preposition, date) tinsert(ret, format('[[%s]]', catTitle)) catTitle = getTitleObject(catTitle) if not catTitle or not catTitle.exists then tinsert(ret, '[[Category:Articles with invalid date parameter in template]]') end elseif cat and not date then tinsert(ret, format('[[Category:%s]]', cat)) end if all then tinsert(ret, format('[[Category:%s]]', all)) end return tconcat(ret) end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end local function getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end local function getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function p.build(boxType, args) if type(args) ~= 'table' then error(format('invalid "args" parameter type; expected type "table", got type "%s"', type(args)), 2) end -- Get the title object and the namespace. local pageTitle = getTitleObject(args.page ~= '' and args.page) local title = pageTitle or mw.title.getCurrentTitle() local demospace = getNamespaceId(args.demospace ~= '' and args.demospace) local nsid = demospace or title.namespace -- Get the box config data from the data page. if boxType == 'mbox' then boxType = getMboxType(nsid) end local dataTables = mw.loadData('Module:Message box/data') local data = dataTables[boxType] if not data then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end -- Only allow blank arguments for the parameter names listed in data.allowBlankParams. local newArgs = {} for k, v in pairs(args) do for i, param in ipairs(data.allowBlankParams or {}) do if v ~= '' or k == param then newArgs[k] = v end end end args = newArgs newArgs = nil ------------------------ Process config data ---------------------------- -- Type data. local typeData = data.types[args.type] local invalidType = args.type and not typeData and true or false typeData = typeData or data.types[data.default] -- Process data for collapsible text fields local name, issue, talk, fix, date, info if data.useCollapsibleTextFields then name = args.name local nameTitle = getTitleObject(name) local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false local sect = args.sect if presentButBlank(sect) then sect = format('This %s ', data.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect .. ' ' end issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '') talk = args.talk if presentButBlank(talk) and isTemplatePage then talk = '#' end fix = args.fix date = args.date if presentButBlank(date) and isTemplatePage then date = lang:formatDate('F Y') end info = args.info end -- Process the talk link, if present. if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = type(talk) == 'string' and getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = ' Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end talk = talkText end end -- Find whether we are using a small message box and process our data accordingly. local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false local smallClass, image, imageRight, text, imageSize if isSmall then smallClass = data.smallClass or 'mbox-small' image = args.smallimage or args.image imageRight = args.smallimageright or args.imageright if data.useCollapsibleTextFields then text = args.smalltext or issue else text = args.smalltext or args.text end imageSize = data.imageSmallSize or '30x30px' else image = args.image imageRight = args.imageright imageSize = '40x40px' text = args.text end -- Process mainspace categories. local mainCats = {} local origCategoryNums -- origCategoryNums might be used in computing the template error category. if data.allowMainspaceCategories then -- Categories for the main namespace. if args.cat then args.cat1 = args.cat end local origCatNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end local origCategoryNums = getArgNums(args, 'category') local catNums = union(origCatNums, origCategoryNums) for _, num in ipairs(catNums) do local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local all = args['all' .. tostring(num)] tinsert(mainCats, formatCategory(cat, args.date, all)) end end -- Process template namespace categories local isTemplatePage = type(name) == 'string' and title.prefixedText == ('Template:' .. name) local templateCats = {} if data.templateCategory then if name then if isTemplatePage then tinsert(templateCats, format('[[Category:%s]]', data.templateCategory)) end elseif not title.isSubpage then tinsert(templateCats, format('[[Category:%s]]', data.templateCategory)) end end -- Add an error category for the template namespace if appropriate. if data.templateErrorCategory then local catName = data.templateErrorCategory local templateCat if not name and not title.isSubpage then templateCat = format('[[Category:%s]]', catName) elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = data.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = format('[[Category:%s|%d]]', catName, count) end if origCategoryNums and #origCategoryNums > 0 then templateCat = format('[[Category:%s|C]]', catName) end end tinsert(templateCats, templatecat) end -- Categories for all namespaces. local allCats = {} if invalidType then local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText tinsert(allCats, format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) end ------------------------ Build the box ---------------------------- local root = htmlBuilder.create() -- Do the subst check. if data.substCheck and args.subst == 'SUBST' then if type(name) == 'string' then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), name, mw.text.nowiki('}}') )) end tinsert(allCats, '[[Category:Pages with incorrectly substituted templates]]') end -- Create the box table. local box = root.tag('table') box .attr('id', args.id) for i, class in ipairs(data.classes) do box .addClass(class) end box .addClass(isSmall and smallClass) .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') .addClass(typeData.class) .addClass(args.class) .cssText(args.style) .attr('role', 'presentation') -- Add the left-hand image. local row = box.tag('tr') local imageCheckBlank = data.imageCheckBlank if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then local imageLeftCell = row.tag('td').addClass('mbox-image') if not isSmall and data.imageCellDiv then imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. end imageLeftCell .wikitext(image or format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) elseif data.imageEmptyCell then row.tag('td') .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if data.useCollapsibleTextFields then textCell .cssText(args.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(talk) .wikitext(' ') .wikitext(fix) .done() end textCellSpan .wikitext(date and format(" <small>''(%s)''</small>", date)) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(info and ' ' .. info) end else textCell .cssText(args.textstyle) .wikitext(text) end -- Add the right-hand image. if imageRight and not (data.imageRightNone and imageRight == 'none') then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not isSmall and data.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(imageRight) end -- Add the below row. if data.below and args.below then box.tag('tr') .tag('td') .attr('colspan', args.imageright and '3' or '2') .addClass('mbox-text') .cssText(args.textstyle) .wikitext(args.below) end ------------------------ Error messages and categories ---------------------------- -- Add error message for invalid type parameters. if invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or '')) end -- Add categories using categoryHandler. root .wikitext(categoryHandler{ main = tconcat(mainCats), template = tconcat(templateCats), all = tconcat(allCats), nocat = args.nocat, demospace = demospace and args.demospace or nil, page = pageTitle and pageTitle.prefixedText or nil }) return tostring(root) end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) end args[k] = v end return p.build(boxType, args) end end p.mbox = makeWrapper('mbox') p.ambox = makeWrapper('ambox') p.cmbox = makeWrapper('cmbox') p.fmbox = makeWrapper('fmbox') p.imbox = makeWrapper('imbox') p.ombox = makeWrapper('ombox') p.tmbox = makeWrapper('tmbox') return p 290f7d900bfe58c950da8b4467ed27e1d73573e3 Module:Yesno 828 3 43 42 2013-09-20T12:23:42Z wikipedia>Mr. Stradivarius 0 change to a simpler Lua-only version Scribunto text/plain -- This is a simplified, Lua-only replacement for the template {{yesno}}. It provides a consistent -- interface for users entering boolean or boolean-style input. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if not val or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true elseif default ~= nil then return default else return true end end becb6841b32054fba72952e27d4486e6c85347e2 44 43 2013-09-26T12:01:45Z wikipedia>Mr. Stradivarius 0 return nil values as nil Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if val == nil then return nil elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true elseif default ~= nil then return default else return true end end eeec3269f614eb69d767350ee3494b2ba261927c 45 44 2013-09-26T13:21:32Z wikipedia>Mr. Stradivarius 0 stop making the default "default" value true, as we run into problems if you need to distinguish between false and nil Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if val == nil then return nil elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true else return default end end 38a200ce278019859b37fd40f22f1927e7fbfa1f Module:Message box/configuration 828 5 129 2013-09-25T11:59:20Z wikipedia>Mr. Stradivarius 0 split data functions from [[Module:Message box]] Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowSmall = true, smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, classPlainlinksYesno = true, imageEmptyCell = true, below = true } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } c7be5a72dbc777ff4962f0d78dbc25c5ae4d16a2 Module:Message box/configuration 828 5 130 129 2013-09-27T13:03:23Z wikipedia>Mr. Stradivarius 0 add ambox parameters to allow as blank, plus the ambox template category Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, classPlainlinksYesno = true, imageEmptyCell = true, below = true } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } e5716e9251c61e225e258e1f752a5fac193152e3 131 130 2013-09-28T03:46:42Z wikipedia>Mr. Stradivarius 0 more semantic name for the plainlinks parameter Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 2d4273a0b6c56893a1f49f4358b10ba5f4df64cb 132 131 2013-09-28T06:35:03Z wikipedia>Mr. Stradivarius 0 Mr. Stradivarius moved page [[Module:Message box/data]] to [[Module:Message box/configuration]] without leaving a redirect: "configuration" better describes what this page does than "data" Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 2d4273a0b6c56893a1f49f4358b10ba5f4df64cb 133 132 2013-09-29T12:13:53Z wikipedia>Mr. Stradivarius 0 add smallParam field for ambox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 0dff139f08f4ff1ae2912bd3b67b4bfe95bf8d58 134 133 2013-10-01T15:14:22Z wikipedia>Mr. Stradivarius 0 add template category for imbox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 0171d8debf2b5f193651d2427216a5851bd9a1b1 135 134 2013-10-03T05:02:52Z wikipedia>Mr. Stradivarius 0 add showInvalidTypeError for all but ambox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'} } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 3b72a3dd61a44c821daa0e430d9ee4a67975bfbf 136 135 2013-10-03T10:02:53Z wikipedia>Mr. Stradivarius 0 use imageEmptyCell for cmbox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } f79015913136f03b57ec9e23783c5c4d3fa7c0f6 137 136 2013-10-03T12:39:41Z wikipedia>Mr. Stradivarius 0 add imageEmptyCell to tmbox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, classes = { 'plainlinks', 'fmbox' }, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } be9ed5517703d69e58a4e310a6457ff407b40d2a 138 137 2013-10-08T09:33:52Z wikipedia>Mr. Stradivarius 0 use Id for fmbox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, useId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 9aa70a2749e02ce6356dd1fa051697a68068973b 139 138 2013-10-08T09:34:57Z wikipedia>Mr. Stradivarius 0 change indenting from spaces to tabs Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, useId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 315fb16a7be963f43ff3ade2a7e18e42aef6c551 140 139 2013-10-08T09:47:26Z wikipedia>Mr. Stradivarius 0 line everything up nicely Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, useId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } e3ae1d8cd067cf1843437d7229f4cdda6b94084c 141 140 2013-10-08T14:17:09Z wikipedia>Mr. Stradivarius 0 useId --> allowId Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 77523dae4dea5b915084de2539c66d6bbc5e4422 142 141 2013-10-13T14:14:18Z wikipedia>Mr. Stradivarius 0 allow issue, fix and subst to be blank for ambox Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 855f138876a520f088ff1605fb05b8440fa2d528 143 142 2013-10-13T15:02:37Z wikipedia>Mr. Stradivarius 0 add a config option to require the name parameter for template categories Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 9ba564cd32c3ba089e7be591b6f915813fb1e159 Module:Category handler 828 19 764 763 2013-09-27T13:05:07Z wikipedia>Mr. Stradivarius 0 pass the demospace parameter to [[Module:Namespace detect]] Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page ndargs.demospace = args.demospace local ndresult = nsDetect.main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. local all = args.all if type(all) == 'string' then ret = ret .. all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end ndargs.other = args.other ndargs.page = args.page ndargs.demospace = args.demospace local data = nsDetect.main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum then local dataArg = args[datanum] if type(dataArg) == 'string' then ret = ret .. dataArg end end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 150432699d8c3469245bfb2bbfe85d40947283d5 Module:Message box 828 4 68 67 2013-09-28T07:15:06Z wikipedia>Mr. Stradivarius 0 rewrite with a "box" object to make the code a little less spaghetti-like Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. local pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = pageTitle or mw.title.getCurrentTitle() local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace) self.nsid = demospace or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do for i, param in ipairs(cfg.allowBlankParams or {}) do if v ~= '' or k == param then newArgs[k] = v end end end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace and args.demospace or nil, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 9284aecd761979660b72cd65cec659e000ce51a0 69 68 2013-09-28T07:22:15Z wikipedia>Mr. Stradivarius 0 try testing for demospace and page params or category handler against the current title object Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. local pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = pageTitle or mw.title.getCurrentTitle() local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace) self.nsid = demospace or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do for i, param in ipairs(cfg.allowBlankParams or {}) do if v ~= '' or k == param then newArgs[k] = v end end end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. local chpage, chdemospace local currentTitle = mw.title.getCurrentTitle if self.title ~= currentTitle then chpage = self.title.prefixedText end if self.nsid ~= currentTitle.namespace then chdemospace = self.nsid end self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = chdemospace, page = chpage } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 65236849413c0f63013053fc9c3264781194799f 70 69 2013-09-28T07:23:08Z wikipedia>Mr. Stradivarius 0 fix brackets Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. local pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = pageTitle or mw.title.getCurrentTitle() local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace) self.nsid = demospace or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do for i, param in ipairs(cfg.allowBlankParams or {}) do if v ~= '' or k == param then newArgs[k] = v end end end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. local chpage, chdemospace local currentTitle = mw.title.getCurrentTitle() if self.title ~= currentTitle then chpage = self.title.prefixedText end if self.nsid ~= currentTitle.namespace then chdemospace = self.nsid end self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = chdemospace, page = chpage } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 843a0f0125f9155feae615de41082d908ec7a649 71 70 2013-09-28T07:31:51Z wikipedia>Mr. Stradivarius 0 on second thoughts, I like this way of passing params to category handler better Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do for i, param in ipairs(cfg.allowBlankParams or {}) do if v ~= '' or k == param then newArgs[k] = v end end end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 93fd14c7af7ce1fefa152903d85a65c10a8bbbd7 72 71 2013-09-28T07:56:02Z wikipedia>Mr. Stradivarius 0 fix bug where the arguments where all getting removed if cfg.allowBlankParams wasn't present Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if not self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 639422ed713926bbcce1c081f4e4d2c83ea02558 73 72 2013-09-28T08:19:45Z wikipedia>Mr. Stradivarius 0 remove a not where a not should not be Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 54742dc7ff07c4c77f168b094a81a85153274f48 74 73 2013-09-29T12:24:45Z wikipedia>Mr. Stradivarius 0 allow small=left for ambox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(title.talkPageTitle, title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } b07edf6cf59ffce3c07a3b9cd45622ff0e593b80 75 74 2013-10-02T22:35:36Z wikipedia>Mr. Stradivarius 0 replace remaining "title" variables with "self.title" Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 43ac0d59cdf13f7cf9907f58ed08b9e9899598a2 76 75 2013-10-02T22:49:18Z wikipedia>Mr. Stradivarius 0 change a couple of "name" variables to "self.name" Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 9a725398b1c20f4015fcf6beb2f7ee0850b25890 77 76 2013-10-02T22:57:36Z wikipedia>Mr. Stradivarius 0 change pageTitle --> self.pageTitle Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s%s%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 9d720db49ffc45df909a5553e2935de89906e3b4 78 77 2013-10-03T04:48:39Z wikipedia>Mr. Stradivarius 0 add a template link when generating the subst error message Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidType = self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidType then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidType then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } caa64f4f9981cbbb3be3094d61cdb9d09cedb3b8 79 78 2013-10-03T05:01:33Z wikipedia>Mr. Stradivarius 0 make invalid type errors depend on cfg.showInvalidTypeError Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Not sure why only some box types use divs, but it probably has something to do -- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } d35fd3e42d02107cf8ade3c54fbc3faa8f0b26d1 80 79 2013-10-03T05:09:34Z wikipedia>Mr. Stradivarius 0 fix comment on image divs Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageCheckBlank = cfg.imageCheckBlank local imageLeft = self.isSmall and args.smallimage or args.image if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 54c412cbe8c6e582e5f80cdbd848f85b0f379575 81 80 2013-10-03T06:39:00Z wikipedia>Mr. Stradivarius 0 try switching the imageLeft logic around Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 2068307d6dd31c77419cbdefa52a4f8ef4a95a57 82 81 2013-10-03T07:01:15Z wikipedia>Mr. Stradivarius 0 add args.class to the classes table Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } bac6aacf254e86d24a3c25e805656bb2cb270fdc 83 82 2013-10-03T07:40:25Z wikipedia>Mr. Stradivarius 0 bug fix: isSmall --> self.isSmall Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then if self.useCollapsibleTextFields then self.text = args.smalltext or self.issue else self.text = args.smalltext or args.text end else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 80df94ed1a473d7d9a53f3d1386b8597558cea45 84 83 2013-10-03T07:54:08Z wikipedia>Mr. Stradivarius 0 change the smalltext logic to work with collapsible text fields Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function presentButBlank(s) if type(s) ~= 'string' then return end if s and not mw.ustring.find(s, '%S') then return true else return false end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect = args.sect if presentButBlank(sect) then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(sect) == 'string' then sect = 'This ' .. sect else sect = nil end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if presentButBlank(talk) and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date = args.date self.date = date and format(" <small>''(%s)''</small>", date) if presentButBlank(self.date) and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } db3ece399e016e507aa0141ab44834db9adf9299 85 84 2013-10-03T08:26:38Z wikipedia>Mr. Stradivarius 0 remove the presentButBlank function, fix bug with blank date values, and trim whitespace from all arguments Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix if args.date and args.date ~= '' then self.date = format(" <small>''(%s)''</small>", args.date) elseif args.date == '' and self.isTemplatePage then self.date = lang:formatDate('F Y') end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } ce260a3117a594ba38c88c2b30013060698bf0ce 86 85 2013-10-03T08:33:16Z wikipedia>Mr. Stradivarius 0 fix date formatting order Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } d008cbaf125e224a8bbe68e2c31571fd52caa23d 87 86 2013-10-03T08:35:51Z wikipedia>Mr. Stradivarius 0 fix sect regression Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .addClass('error') .css('text-align', 'center') .wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 238bd49ece902df5eef07b17506326019bb603a5 88 87 2013-10-03T09:58:31Z wikipedia>Mr. Stradivarius 0 use the same invalid type warning as the previous template Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfgTables = mw.loadData('Module:Message box/configuration') local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end return { box = box, makeBox = makeBox, mbox = makeWrapper('mbox'), ambox = makeWrapper('ambox'), cmbox = makeWrapper('cmbox'), fmbox = makeWrapper('fmbox'), imbox = makeWrapper('imbox'), ombox = makeWrapper('ombox'), tmbox = makeWrapper('tmbox') } 8ad69ffd0f3d3f103968f265af7f199358a4730e 89 88 2013-10-03T13:07:08Z wikipedia>Mr. Stradivarius 0 load box types from the config page automatically Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end local p = { box = box, makeBox = makeBox, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 9f35285056a4bd3a27f7ba232185486431186d29 90 89 2013-10-08T01:58:55Z wikipedia>Mr. Stradivarius on tour 0 make args.all work Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. self.id = args.id self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end local p = { box = box, makeBox = makeBox, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p a3cee92a4f4549e32cd0efa7b1e2e23c49df1e09 91 90 2013-10-08T09:48:39Z wikipedia>Mr. Stradivarius 0 only add id when cfg.useId is true Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.useId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function makeBox(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return makeBox(boxType, args) end end local p = { box = box, makeBox = makeBox, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 737093312f738507b5407329047f431c669f8582 92 91 2013-10-08T12:27:45Z wikipedia>Mr. Stradivarius 0 don't make the box object available from other modules - it's not really designed for that kind of use Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.useId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p db6c083913c275676577e6bf7ea045dde4c80148 93 92 2013-10-08T14:17:37Z wikipedia>Mr. Stradivarius 0 useId --> allowId Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 41ed19d52228f0906a1320dbb14eff062b9ff4eb 94 93 2013-10-11T14:40:49Z wikipedia>Mr. Stradivarius 0 control for blank values of args.date Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and not date then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p ae506f0bd0c58e4edecfe5c1aad776a92760b1da 95 94 2013-10-11T14:43:38Z wikipedia>Mr. Stradivarius 0 more controlling for blank dates Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') self.categoryParamNums = union(self.catNums, self.categoryNums) if args.all then args.all1 = args.all end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p be2768a32f3641ca987218e2351b11b2150d62cd 96 95 2013-10-13T13:32:48Z wikipedia>Mr. Stradivarius 0 get arg nums for all parameters as well as cat and category parameters Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p f9ff6e4719978c77666e6031191313a92640f3b3 97 96 2013-10-13T14:09:44Z wikipedia>Mr. Stradivarius 0 fix stray nsid variable to self.nsid Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 22b0a86c8c982a4b839afa59ddfb4ea8fda3bbef 98 97 2013-10-13T14:23:17Z wikipedia>Mr. Stradivarius 0 switch indentation to tabs Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 8822e31fa69d1617c5fd7aed11803deb37021708 99 98 2013-10-13T14:43:49Z wikipedia>Mr. Stradivarius 0 control for blank values of issue, fix, and subst Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p b27919c91e1155353f39038fafef7a185b1f849a 100 99 2013-10-13T14:46:01Z wikipedia>Mr. Stradivarius 0 indentation tweak Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if cfg.templateCategory then if self.name then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 12a5d0faf02dfe16cf2b971838b887966e88b375 101 100 2013-10-13T15:13:52Z wikipedia>Mr. Stradivarius 0 require name parameter for ambox Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p a376d0d2a357d04d1d83304da7142a0b80b954cb Module:Yesno 828 3 46 45 2013-10-03T09:37:13Z wikipedia>Mr. Stradivarius 0 Protected Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: 3000 transclusions ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if val == nil then return nil elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true else return default end end 38a200ce278019859b37fd40f22f1927e7fbfa1f Module:Category handler 828 19 765 764 2013-10-15T14:10:19Z wikipedia>Mr. Stradivarius 0 test the sandbox version of [[Module:Namespace detect]] Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect/sandbox') -- REMOVE "/sandbox" BEFORE GOING LIVE local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page ndargs.demospace = args.demospace local ndresult = nsDetect.main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. local all = args.all if type(all) == 'string' then ret = ret .. all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end ndargs.other = args.other ndargs.page = args.page ndargs.demospace = args.demospace local data = nsDetect.main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum then local dataArg = args[datanum] if type(dataArg) == 'string' then ret = ret .. dataArg end end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 5e6332718970975f36fe1eec80470889e27a16dd 766 765 2013-10-15T14:11:53Z wikipedia>Mr. Stradivarius 0 use the _main function for nsDetect rather than the main function Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect/sandbox') -- REMOVE "/sandbox" BEFORE GOING LIVE local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page ndargs.demospace = args.demospace local ndresult = nsDetect._main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. local all = args.all if type(all) == 'string' then ret = ret .. all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end ndargs.other = args.other ndargs.page = args.page ndargs.demospace = args.demospace local data = nsDetect._main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum then local dataArg = args[datanum] if type(dataArg) == 'string' then ret = ret .. dataArg end end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 347cb19b163acdcb1c6ec047c12f846a55dc2e3a 767 766 2013-10-20T10:42:36Z wikipedia>Mr. Stradivarius 0 use live version of [[Module:Namespace detect]] Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page ndargs.demospace = args.demospace local ndresult = nsDetect._main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. local all = args.all if type(all) == 'string' then ret = ret .. all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end ndargs.other = args.other ndargs.page = args.page ndargs.demospace = args.demospace local data = nsDetect._main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum then local dataArg = args[datanum] if type(dataArg) == 'string' then ret = ret .. dataArg end end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 9aab5ef9e38fbbac247a6e2c8e6d2dcf17f3a512 768 767 2013-10-20T10:48:14Z wikipedia>Mr. Stradivarius 0 Protected Module:Category handler: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite)) Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, with a few improvements: all -- -- namespaces and all namespace aliases are supported, and namespace names are detected -- -- automatically for the local wiki. This module requires [[Module:Namespace detect]] and -- -- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis -- -- by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- -- Get dependent modules local nsDetect = require('Module:Namespace detect') local yesno = require('Module:Yesno') ---------------------------------------------------------------------------------------------------------- -- Local functions -- -- The following are internal functions, which we do not want to be accessible from other modules. -- ---------------------------------------------------------------------------------------------------------- -- Find whether we need to return a category or not. local function needsCategory(pageObject, args) -- Don't categorise if the relevant options are set. if yesno(args[cfg.nocat]) or yesno(args[cfg.categories]) == false or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes and args[cfg.category2] ~= cfg.category2Negative ) then return false end -- If there is no pageObject available, then that either means that we are over -- the expensive function limit or that the title specified was invalid. Invalid -- titles will probably only be a problem during testing, so we choose the best -- fallback for being over the expensive function limit. The fallback behaviour -- of the old template was to assume the page was not a subpage, so we will do -- the same here. if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then return false end if args[cfg.subpage] == cfg.subpageOnly and (not pageObject or (pageObject and not pageObject.isSubpage)) then return false end return true end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck(args) if yesno(args[cfg.nocat]) == false or yesno(args[cfg.categories]) == true or args[cfg.category2] == cfg.category2Yes then return false else return true end end -- Find whether any namespace parameters have been specified. -- Mappings is the table of parameter mappings taken from -- [[Module:Namespace detect]]. local function nsParamsExist(mappings, args) if args[cfg.all] or args[cfg.other] then return true end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if args[param] then return true end end end return false end ---------------------------------------------------------------------------------------------------------- -- Global functions -- -- The following functions are global, because we want them to be accessible from #invoke and -- -- from other Lua modules. -- ---------------------------------------------------------------------------------------------------------- local p = {} -- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise. -- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion". function p.matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(cfg.blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end -- The main structure of the module. Checks whether we need to categorise, -- and then passes the relevant arguments to [[Module:Namespace detect]]. function p._main(args) -- Get the page object and argument mappings from -- [[Module:Namespace detect]], to save us from having to rewrite the -- code. local pageObject = nsDetect.getPageObject(args[cfg.page]) local mappings = nsDetect.getParamMappings() if not needsCategory(pageObject, args) then return end local ret = '' -- Check blacklist if necessary. if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then if not nsParamsExist(mappings, args) then -- No namespace parameters exist; basic usage. Pass args[1] to -- [[Module:Namespace detect]] using the default namespace -- parameters, and return the result. local ndargs = {} for _, ndarg in ipairs(cfg.defaultNamespaces) do ndargs[ndarg] = args[1] end ndargs.page = args.page ndargs.demospace = args.demospace local ndresult = nsDetect._main(ndargs) if ndresult then ret = ret .. ndresult end else -- Namespace parameters exist; advanced usage. -- If the all parameter is specified, return it. local all = args.all if type(all) == 'string' then ret = ret .. all end -- Get the arguments to pass to [[Module:Namespace detect]]. local ndargs = {} for ns, params in pairs(mappings) do for _, param in ipairs(params) do ndargs[param] = args[param] or args[cfg.other] or nil end end ndargs.other = args.other ndargs.page = args.page ndargs.demospace = args.demospace local data = nsDetect._main(ndargs) -- Work out what to return based on the result of the namespace detect call. local datanum = tonumber(data) if type(datanum) == 'number' then -- "data" is a number, so return that positional parameter. -- Remove non-positive integer values, as only positive integers -- from 1-10 were used with the old template. if datanum > 0 and math.floor(datanum) == datanum then local dataArg = args[datanum] if type(dataArg) == 'string' then ret = ret .. dataArg end end else -- "data" is not a number, so return it as it is. if type(data) == 'string' then ret = ret .. data end end end end return ret end function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". These -- parameters are put in lower case whenever they appear in the old -- template, so we can just do it once here and save ourselves some work. local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage} for _, v in ipairs(lowercase) do local argVal = args[v] if type(argVal) == 'string' then args[v] = mw.ustring.lower(argVal) end end return p._main(args) end return p 9aab5ef9e38fbbac247a6e2c8e6d2dcf17f3a512 Module:Namespace detect 828 25 855 854 2013-10-20T10:34:43Z wikipedia>Mr. Stradivarius 0 allow access to the p._main() function from other modules, add an option to use the cfg.talk parameter in p.table(), and whitespace tweaks Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a few -- -- improvements: all namespaces and all namespace aliases are supported, and namespace -- -- names are detected automatically for the local wiki. Function names can be configured -- -- for different wikis by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- The name for the parameter to display content for the main namespace: cfg.main = 'main' -- The name for the parameter to display content in talk namespaces: cfg.talk = 'talk' -- The name for the parameter to display content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- The name for the parameter to set a demonstration namespace: cfg.demospace = 'demospace' -- The name for the parameter to set a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible -- subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- -- Declare the table of functions to return. local p = {} -- Get the page object. This will return the page object for the page specified, or nil if there are -- errors in the title or if the expensive function count has been exceeded. function p.getPageObject(page) if page then -- Get the page object, passing the function through pcall in case we are over the expensive -- function count limit. local noError, pageObject = pcall(mw.title.new, page) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: [''] = { {'main'}, }, ['wikipedia'] = { {'wikipedia', 'project', 'wp'} } ]] function p.getParamMappings() local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end --[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk parameter is optional, in case it needs to be excluded in the documentation. ]] function p.table(frame) -- Find whether to use the talk link or not. local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Get the parameter mappings. local mappings = p.getParamMappings() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace, as we want this -- to be first in the list. ret = ret .. '\n|-' .. '\n| <code>' .. cfg.main .. '</code>' .. '\n|' if useTalk then ret = ret .. '\n|-' .. '\n| <code>' .. cfg.talk .. '</code>' .. '\n|' end -- Enclose all parameter names in <code> tags. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then for i, param in ipairs(params) do mappings[ns][i] = '<code>' .. param .. '</code>' end end end -- Generate the other wikitable rows. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. ret = ret .. '\n|-' .. '\n| ' .. params[1] .. '\n| ' .. table.concat(params, ', ', 2) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end -- Gets the namespace name to compare to the arguments. The returned value is lower-case. local function getNamespace(page, demospace) local ret if demospace then -- Handle "demospace = main" properly. if mw.ustring.lower(demospace) == cfg.main then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- {{namespace detect}} uses the same value for all talk namespaces, so that's what -- the module should do too. ret = cfg.talk else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end -- Compare the namespace found with the parameters that have been specified, and return content of -- the appropriate parameter. function p._main(args) -- Get the namespace to compare the parameters to, and the parameter mapping table. local namespace = getNamespace(args[cfg.page], args[cfg.demospace]) local mappings = p.getParamMappings() -- Check for any matches in the namespace arguments. The order we check them doesn't matter, -- as there can only be one match. for ns, params in pairs(mappings) do if ns == namespace then -- Check all aliases for matches. The default local namespace is checked first, as -- {{namespace detect}} checked these before alias names. for _, param in ipairs(params) do if args[param] then return args[param] end end end end -- If there were no matches, return parameters for other namespaces. This happens if there -- was no text specified for the namespace that was detected or if the demospace parameter -- is not a valid namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end function p.main(frame) -- If called via #invoke, use the args passed into the invoking template, or the args -- passed to #invoke if any exist. Otherwise assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and page parameters. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return p._main(args) end return p e86845ee27ea32cf63ca946b120d521c48da46f5 856 855 2013-10-24T06:00:56Z wikipedia>Mr. Stradivarius 0 add the ability to use the subject namespace if on a talk page, switch indentation to tabs, and clean up some of the comments Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a few -- -- improvements: all namespaces and all namespace aliases are supported, and namespace -- -- names are detected automatically for the local wiki. The module can also use the -- -- corresponding subject namespace value if it is used on a talk page. Parameter names -- -- can be configured for different wikis by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local yesno = require('Module:Yesno') local p = {} function p.getPageObject(page) -- Get the page object, passing the function through pcall in case we are over the expensive function count limit. if page then local noError, pageObject = pcall(mw.title.new, page) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end function p.getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: [''] = { {'main'}, }, ['wikipedia'] = { {'wikipedia', 'project', 'wp'} } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end local function getNamespace(args) -- Gets the namespace name from the page object. local page = args[cfg.page] local demospace = args[cfg.demospace] local subjectns = args[cfg.subjectns] local ret if demospace then -- Handle "demospace = main" properly. if mw.ustring.lower(demospace) == cfg.main then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk. if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = cfg.talk end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end function p._main(args) -- Get the namespace to compare the parameters to, and the parameter mapping table. local namespace = getNamespace(args) local mappings = p.getParamMappings() -- Check for any matches in the namespace arguments. The order we check them doesn't matter, -- as there can only be one match. for ns, params in pairs(mappings) do if ns == namespace then -- Check all aliases for matches. The default local namespace is checked first, as -- {{namespace detect}} checked these before alias names. for _, param in ipairs(params) do if args[param] then return args[param] end end end end -- If there were no matches, return parameters for other namespaces. This happens if there -- was no text specified for the namespace that was detected or if the demospace parameter -- is not a valid namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. if args[cfg.other] then return args[cfg.other] end end function p.main(frame) -- If called via #invoke, use the args passed into the invoking template, or the args -- passed to #invoke if any exist. Otherwise assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and page parameters. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return p._main(args) end function p.table(frame) --[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk parameter is optional, in case it needs to be excluded in the documentation. ]] local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter. local mappings = p.getParamMappings() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace, as we want this to be first in the list. ret = ret .. '\n|-' .. '\n| <code>' .. cfg.main .. '</code>' .. '\n|' if useTalk then ret = ret .. '\n|-' .. '\n| <code>' .. cfg.talk .. '</code>' .. '\n|' end -- Enclose all parameter names in <code> tags. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then for i, param in ipairs(params) do mappings[ns][i] = '<code>' .. param .. '</code>' end end end -- Generate the other wikitable rows. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. ret = ret .. '\n|-' .. '\n| ' .. params[1] .. '\n| ' .. table.concat(params, ', ', 2) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p dd5dbe4e9255a5a564405609073ba259b025e9c4 857 856 2013-10-26T08:53:38Z wikipedia>Mr. Stradivarius 0 allow other modules to return false if it is specified, and fix an error in the comments for the namespace mappings Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a few -- -- improvements: all namespaces and all namespace aliases are supported, and namespace -- -- names are detected automatically for the local wiki. The module can also use the -- -- corresponding subject namespace value if it is used on a talk page. Parameter names -- -- can be configured for different wikis by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local yesno = require('Module:Yesno') local p = {} function p.getPageObject(page) -- Get the page object, passing the function through pcall in case we are over the expensive function count limit. if page then local noError, pageObject = pcall(mw.title.new, page) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end function p.getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end local function getNamespace(args) -- Gets the namespace name from the page object. local page = args[cfg.page] local demospace = args[cfg.demospace] local subjectns = args[cfg.subjectns] local ret if demospace then -- Handle "demospace = main" properly. if mw.ustring.lower(demospace) == cfg.main then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk. if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = cfg.talk end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end return mw.ustring.lower(ret) end function p._main(args) -- Get the namespace to compare the parameters to, and the parameter mapping table. local namespace = getNamespace(args) local mappings = p.getParamMappings() -- Check for any matches in the namespace arguments. The order we check them doesn't matter, -- as there can only be one match. for ns, params in pairs(mappings) do if ns == namespace then -- Check all aliases for matches. The default local namespace is checked first, as -- {{namespace detect}} checked these before alias names. for _, param in ipairs(params) do if args[param] ~= nil then return args[param] end end end end -- If there were no matches, return parameters for other namespaces. This happens if there -- was no text specified for the namespace that was detected or if the demospace parameter -- is not a valid namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. if args[cfg.other] ~= nil then return args[cfg.other] end end function p.main(frame) -- If called via #invoke, use the args passed into the invoking template, or the args -- passed to #invoke if any exist. Otherwise assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and page parameters. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return p._main(args) end function p.table(frame) --[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk parameter is optional, in case it needs to be excluded in the documentation. ]] local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter. local mappings = p.getParamMappings() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace, as we want this to be first in the list. ret = ret .. '\n|-' .. '\n| <code>' .. cfg.main .. '</code>' .. '\n|' if useTalk then ret = ret .. '\n|-' .. '\n| <code>' .. cfg.talk .. '</code>' .. '\n|' end -- Enclose all parameter names in <code> tags. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then for i, param in ipairs(params) do mappings[ns][i] = '<code>' .. param .. '</code>' end end end -- Generate the other wikitable rows. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. ret = ret .. '\n|-' .. '\n| ' .. params[1] .. '\n| ' .. table.concat(params, ', ', 2) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p cabc92d36dfe590edfab30df4ade270f0129c992 858 857 2013-10-28T07:47:48Z wikipedia>Mr. Stradivarius 0 fix the education program namespace bug by replacing underscores with spaces in the getNamespace function Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a few -- -- improvements: all namespaces and all namespace aliases are supported, and namespace -- -- names are detected automatically for the local wiki. The module can also use the -- -- corresponding subject namespace value if it is used on a talk page. Parameter names -- -- can be configured for different wikis by altering the values in the "cfg" table. -- -- -- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local yesno = require('Module:Yesno') local p = {} function p.getPageObject(page) -- Get the page object, passing the function through pcall in case we are over the expensive function count limit. if page then local noError, pageObject = pcall(mw.title.new, page) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end function p.getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end local function getNamespace(args) -- Gets the namespace name from the page object. local page = args[cfg.page] local demospace = args[cfg.demospace] local subjectns = args[cfg.subjectns] local ret if demospace then -- Handle "demospace = main" properly. if mw.ustring.lower(demospace) == cfg.main then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk. if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = cfg.talk end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = mw.ustring.gsub(ret, '_', ' ') return mw.ustring.lower(ret) end function p._main(args) -- Get the namespace to compare the parameters to, and the parameter mapping table. local namespace = getNamespace(args) local mappings = p.getParamMappings() -- Check for any matches in the namespace arguments. The order we check them doesn't matter, -- as there can only be one match. for ns, params in pairs(mappings) do if ns == namespace then -- Check all aliases for matches. The default local namespace is checked first, as -- {{namespace detect}} checked these before alias names. for _, param in ipairs(params) do if args[param] ~= nil then return args[param] end end end end -- If there were no matches, return parameters for other namespaces. This happens if there -- was no text specified for the namespace that was detected or if the demospace parameter -- is not a valid namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. if args[cfg.other] ~= nil then return args[cfg.other] end end function p.main(frame) -- If called via #invoke, use the args passed into the invoking template, or the args -- passed to #invoke if any exist. Otherwise assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace and remove blank arguments for demospace and page parameters. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = mw.text.trim(v) -- Trim whitespace. end if k == cfg.demospace or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end return p._main(args) end function p.table(frame) --[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk parameter is optional, in case it needs to be excluded in the documentation. ]] local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter. local mappings = p.getParamMappings() -- Start the wikitable. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. cfg.wikitableNamespaceHeader .. '\n! ' .. cfg.wikitableAliasesHeader -- Generate the row for the main namespace, as we want this to be first in the list. ret = ret .. '\n|-' .. '\n| <code>' .. cfg.main .. '</code>' .. '\n|' if useTalk then ret = ret .. '\n|-' .. '\n| <code>' .. cfg.talk .. '</code>' .. '\n|' end -- Enclose all parameter names in <code> tags. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then for i, param in ipairs(params) do mappings[ns][i] = '<code>' .. param .. '</code>' end end end -- Generate the other wikitable rows. for ns, params in pairs(mappings) do if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace. ret = ret .. '\n|-' .. '\n| ' .. params[1] .. '\n| ' .. table.concat(params, ', ', 2) end end -- End the wikitable. ret = ret .. '\n|-' .. '\n|}' return ret end return p 4a148fe652e4d84f3739687bb71d312e96e165e0 Module:Yesno 828 3 47 46 2013-10-20T10:50:42Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in modules with millions of transclusions ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite)) Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if val == nil then return nil elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true else return default end end 38a200ce278019859b37fd40f22f1927e7fbfa1f 48 47 2013-11-18T09:30:00Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in various interface messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case if val == nil then return nil elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true else return default end end 38a200ce278019859b37fd40f22f1927e7fbfa1f Module:Message box 828 4 102 101 2013-10-20T12:32:07Z wikipedia>Mr. Stradivarius 0 Protected Module:Message box: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite)) Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p a376d0d2a357d04d1d83304da7142a0b80b954cb 103 102 2013-10-20T12:36:38Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Message box: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in system messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields then self.name = args.name local nameTitle = getTitleObject(self.name) self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' and self.isTemplatePage then talk = '#' end if talk then -- See if the talk link exists and is for a talk or a content namespace. local talkTitle = getTitleObject(talk) if not talkTitle or not talkTitle.isTalkPage then -- If we couldn't process the talk page link, get the talk page of the current page. local success success, talkTitle = pcall(self.title.talkPageTitle, self.title) if not success then talkTitle = nil end end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkTitle.isTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p a376d0d2a357d04d1d83304da7142a0b80b954cb 104 103 2013-10-23T12:51:42Z wikipedia>Mr. Stradivarius 0 fix talk page links, and fix bug producing spurious WhatLinksHere links (however note that a link will appear for [[Foo]] if the code "talk=Foo" is used) Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim local box = {} local function getTitleObject(page, ...) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page, ...) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set, -- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false end -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank. and self.templateTitle and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle)) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading, -- and make a link to the talk page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) box:setTitle(args) local cfg = box:getConfig(boxType) args = box:removeBlankArgs(cfg, args) box:setBoxParameters(cfg, args) return box:export() end local function makeWrapper(boxType) return function (frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in from the debug console -- or from another Lua module. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs(frame.args) do origArgs = frame.args break end else origArgs = frame end -- Trim whitespace. local args = {} for k, v in pairs(origArgs) do if type(v) == 'string' then v = trim(v) end args[k] = v end return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p b17af5e22dc28b290c34737272dfb4e3cfbb8ab0 Module:Message box/configuration 828 5 144 143 2013-10-20T12:32:18Z wikipedia>Mr. Stradivarius 0 Protected Module:Message box/configuration: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite)) Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 9ba564cd32c3ba089e7be591b6f915813fb1e159 145 144 2013-10-20T12:37:04Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Message box/configuration: used in system messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite)) Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 9ba564cd32c3ba089e7be591b6f915813fb1e159 Template:Ambox 10 18 743 742 2013-10-20T12:35:58Z wikipedia>Mr. Stradivarius 0 switch to Lua version wikitext text/x-wiki {{#invoke:Message box|ambox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> bf0ee50293a043290608e9f2a2c54ec194e9cdeb 744 743 2013-10-20T12:40:26Z wikipedia>Mr. Stradivarius 0 Changed protection level of Template:Ambox: [[WP:High-risk templates|Highly visible template]]: allow template editors to edit ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite)) wikitext text/x-wiki {{#invoke:Message box|ambox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> bf0ee50293a043290608e9f2a2c54ec194e9cdeb 745 744 2013-10-21T11:56:45Z wikipedia>Mr. Stradivarius 0 revert to pre-Lua version for now - the update was causing spurious links in WhatLinksHere wikitext text/x-wiki {{#ifeq:{{{subst}}}|SUBST |{{#if:{{{name|}}} |{{Error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}} }}[[Category:Pages with incorrectly substituted templates]] }}{{Ambox/{{#ifeq:{{{small}}}|left|small|core}} |type = {{{type|}}} |image = {{{image|}}} |smallimage = {{#if:{{{smallimage|}}}|{{{smallimage}}}|{{{image|}}}}} |imageright = {{{imageright|}}} |smallimageright = {{#if:{{{smallimageright|}}}|{{{smallimageright}}}|{{{imageright|}}}}} |class = ambox-{{#switch:{{{type|}}} |speedy = speedy |delete = delete |content = content |style = style |move = move |protection = protection |notice|#default = notice }} {{{class|}}} |style = {{{style|}}} |textstyle = {{{textstyle|}}} |smalltext = {{{smalltext|}}} |talk = {{#switch:{{{talk|¬}}} |¬ = <!-- No talk link used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|#}} |#default = {{{talk}}} }} |issue = {{#switch:{{{sect|¬}}} |¬ = <!-- No section parameter used --> | = This article |This {{{sect}}} }} {{{issue<includeonly>|</includeonly>}}} {{{text|}}} |fix = {{{fix<includeonly>|</includeonly>}}} |date = {{#switch:{{{date|¬}}} |¬ = <!-- No date used --> | = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} |#default = {{{date}}} }} |info = {{{info|}}} }}{{Category handler |nocat={{{nocat|<noinclude>true</noinclude>}}} |main={{Ambox/category |cat={{{cat|{{{category|}}}}}} |all={{{all|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat2|{{{category2|}}}}}} |all={{{all2|}}} |date={{{date|}}} }}{{Ambox/category |cat={{{cat3|{{{category3|}}}}}} |all={{{all3|}}} |date={{{date|}}} }} |template={{#switch:Template:{{{name|}}} |{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}} |[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]] }}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}} |[[Category:Article message templates with missing parameters|C]] }} |Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}} }} }}<noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> f641f604608e67e0fd6af2ff02712ad3dd5b9b83 746 745 2013-10-23T12:52:13Z wikipedia>Mr. Stradivarius 0 Undid revision 578101879 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) problems with module have been fixed - trying again wikitext text/x-wiki {{#invoke:Message box|ambox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> bf0ee50293a043290608e9f2a2c54ec194e9cdeb Module:Italic title 828 6 174 173 2013-11-15T15:18:20Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Italic title: [[Wikipedia:Lua/Modules|High-risk Lua module]]: allow template editors ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) -- Process the arguments. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation parentheses, if any. local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If parentheses were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and parentheses and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. parentheses else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 0e237db42944fe60903ba0c2dc4a982a8cf10875 Module:Navbar 828 8 247 246 2013-12-03T17:17:17Z wikipedia>Edokter 0 Does not work, now hidden in [[MediaWiki:Print.css]] Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end function error(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end function getTitle( pageName ) pageName = trim( pageName ); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); else page_title = mw.title.new( pageName, 'Template' ); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function _navbar( args ) if not args[1] then return error('No name provided') end local good, title, talk_title; good, title, talk_title = pcall( getTitle, args[1] ); if not good then return error(title); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p 1c008b209b2afd108799eec124b33dfaf11a8c1f Module:Arguments 828 2 2 2013-12-07T16:01:15Z wikipedia>Mr. Stradivarius 0 create argument-processing module Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. local function getArguments(frame, options) options = type(options) == 'table' and options or {} local fargs, pargs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else fargs = type(frame) == 'table' and frame or {} pargs = {} end local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, ...) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. local tables = {...} for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end local firstArgs, secondArgs = fargs, pargs if options.parentFirst then firstArgs, secondArgs = pargs, fargs end metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else local firstVal = tidyVal(key, firstArgs[key]) if firstVal ~= nil then return firstVal else return tidyVal(key, secondArgs[key]) end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, firstArgs, secondArgs) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, firstArgs, secondArgs) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return getArguments 3b47463da132a4eeaf3128399e228ab6e93a6d41 3 2 2013-12-09T02:19:53Z wikipedia>Mr. Stradivarius 0 return a table rather than a function, improve the comments Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assume arguments are passed directly in. local fargs, pargs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else fargs = type(frame) == 'table' and frame or {} pargs = {} end local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated functions to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, ...) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. local tables = {...} for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of frame args and parent args. local firstArgs, secondArgs = fargs, pargs if options.parentFirst then firstArgs, secondArgs = pargs, fargs end -- Define metatable behaviour. metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else local firstVal = tidyVal(key, firstArgs[key]) if firstVal ~= nil then return firstVal else return tidyVal(key, secondArgs[key]) end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, firstArgs, secondArgs) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, firstArgs, secondArgs) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 2c12d99e822e5b21a12e4eb109aeddfe87c3f31a 4 3 2013-12-09T02:25:52Z wikipedia>Mr. Stradivarius 0 add a more detailed comment about metatable behaviour Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assume arguments are passed directly in. local fargs, pargs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else fargs = type(frame) == 'table' and frame or {} pargs = {} end local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated functions to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, ...) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. local tables = {...} for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of frame args and parent args. local firstArgs, secondArgs = fargs, pargs if options.parentFirst then firstArgs, secondArgs = pargs, fargs end --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- fargs and pargs tables once. Also, we keep a record in the metatable of when pairs and ipairs have -- been called, so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run -- ipairs on fargs and pargs if pairs has already been run, as all the arguments will already have been -- copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else local firstVal = tidyVal(key, firstArgs[key]) if firstVal ~= nil then return firstVal else return tidyVal(key, secondArgs[key]) end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, firstArgs, secondArgs) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, firstArgs, secondArgs) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments eaa93fcdf2d148d8159b12ee11aa62a2dfdada4d 5 4 2013-12-09T07:17:32Z wikipedia>Mr. Stradivarius 0 check fargs and pargs before writing new values to args if options.noOverwrite is set Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assume arguments are passed directly in. local fargs, pargs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else fargs = type(frame) == 'table' and frame or {} pargs = {} end local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated functions to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, ...) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. local tables = {...} for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of frame args and parent args. local firstArgs, secondArgs = fargs, pargs if options.parentFirst then firstArgs, secondArgs = pargs, fargs end --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- fargs and pargs tables once. Also, we keep a record in the metatable of when pairs and ipairs have -- been called, so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run -- ipairs on fargs and pargs if pairs has already been run, as all the arguments will already have been -- copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else local firstVal = tidyVal(key, firstArgs[key]) if firstVal ~= nil then return firstVal else return tidyVal(key, secondArgs[key]) end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, firstArgs, secondArgs) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, firstArgs, secondArgs) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments c1688daf5bbe63393a632ac5c0f1c3d7189826e3 6 5 2013-12-09T12:03:39Z wikipedia>Mr. Stradivarius 0 use an array to hold argument tables rather than firstArgs and secondArgs variables Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else luaArgs = type(frame) == 'table' and frame or {} end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated function to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {} if options.parentFirst then table.insert(argTables, pargs) table.insert(argTables, fargs) else table.insert(argTables, fargs) table.insert(argTables, pargs) end table.insert(argTables, luaArgs) --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, -- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs -- and pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else for i, argTable in ipairs(argTables) do local argTableVal = tidyVal(argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 6c4ede5d4e8b0fb1fb713bbaeeebf75a02096d2d 7 6 2013-12-09T12:08:10Z wikipedia>Mr. Stradivarius 0 add options.frameOnly and options.parentOnly Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else luaArgs = type(frame) == 'table' and frame or {} end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated function to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {} if options.frameOnly then table.insert(argTables, fargs) elseif options.parentOnly then table.insert(argTables, pargs) elseif options.parentFirst then table.insert(argTables, pargs) table.insert(argTables, fargs) else table.insert(argTables, fargs) table.insert(argTables, pargs) end table.insert(argTables, luaArgs) --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, -- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs -- and pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else for i, argTable in ipairs(argTables) do local argTableVal = tidyVal(argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 9a6a143427ff3b8d2fdc9eefeb260da8f15cb745 8 7 2013-12-09T13:22:16Z wikipedia>Mr. Stradivarius 0 oops, forgot the first parameter to tidyVal Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else luaArgs = type(frame) == 'table' and frame or {} end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated function to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {} if options.frameOnly then table.insert(argTables, fargs) elseif options.parentOnly then table.insert(argTables, pargs) elseif options.parentFirst then table.insert(argTables, pargs) table.insert(argTables, fargs) else table.insert(argTables, fargs) table.insert(argTables, pargs) end table.insert(argTables, luaArgs) --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, -- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs -- and pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else for i, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments a9f32e709e46c7c0d114445f3d97dbb1d57b8cb0 9 8 2013-12-09T13:51:00Z wikipedia>Mr. Stradivarius 0 Protected Module:Arguments: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if frame == mw.getCurrentFrame() then fargs = frame.args pargs = frame:getParent().args else luaArgs = type(frame) == 'table' and frame or {} end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated function to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {} if options.frameOnly then table.insert(argTables, fargs) elseif options.parentOnly then table.insert(argTables, pargs) elseif options.parentFirst then table.insert(argTables, pargs) table.insert(argTables, fargs) else table.insert(argTables, fargs) table.insert(argTables, pargs) end table.insert(argTables, luaArgs) --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, -- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs -- and pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else for i, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments a9f32e709e46c7c0d114445f3d97dbb1d57b8cb0 10 9 2013-12-10T21:50:32Z wikipedia>Mr. Stradivarius 0 don't use "if frame == mw.getCurrentFrame()" Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local arguments = {} function arguments.getArgs(frame, options) options = type(options) == 'table' and options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if type(frame) == 'table' and type(frame.args) == 'table' and type(frame.getParent) == 'function' then fargs = frame.args pargs = frame:getParent().args else luaArgs = type(frame) == 'table' and frame or {} end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) local function tidyVal(key, val) -- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks. -- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage. if type(val) == 'string' then if options.trim ~= false then val = mw.text.trim(val) end if options.removeBlanks == false or mw.ustring.find(val, '%S') then return val end else return val end end -- Use a user-generated function to tidy the values if specified. local valueFunc = options.valueFunc if valueFunc then local valueFuncType = type(valueFunc) if valueFuncType == 'function' then tidyVal = valueFunc else error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then metaArgs[key] = tidyVal(key, val) end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {} if options.frameOnly then table.insert(argTables, fargs) elseif options.parentOnly then table.insert(argTables, pargs) elseif options.parentFirst then table.insert(argTables, pargs) table.insert(argTables, fargs) else table.insert(argTables, fargs) table.insert(argTables, pargs) end table.insert(argTables, luaArgs) --[[ -- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the -- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, -- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs -- and pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then return val else for i, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end end end metatable.__newindex = function (t, key, val) if not options.readOnly and (not options.noOverwrite or args[key] == nil) then metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 8814b0ba2c6ace12b4d425201a93dc45d0930429 11 10 2013-12-11T13:06:02Z wikipedia>Mr. Stradivarius 0 memoize nils, add type checks for frame and options, use string library functions instead of mw.text.trim and mw.ustring.find, define four different tidyVal functions to avoid checking options every time Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) -- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions -- depending on the options chosen. This is so that we don't have to call the options table every time the function is called. local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. -- We are also memoizing nil values, but those values can be overwritten. for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the -- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase -- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we -- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and -- pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2) elseif options.noOverwrite and args[key] ~= nil then error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 67a6c589d8c3093fb9492e344e821631d7c749ed 12 11 2013-12-12T03:13:28Z wikipedia>Mr. Stradivarius 0 tweak comment Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them. local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) -- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions -- depending on the options chosen. This is so that we don't have to call the options table every time the function is called. local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. -- We are also memoizing nil values, but those values can be overwritten. for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the -- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase -- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we -- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and -- pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2) elseif options.noOverwrite and args[key] ~= nil then error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments e6db5f78210f2802c5d52b2b532df4f171dc9ba7 Module:TableTools 828 7 186 2013-12-15T10:40:22Z wikipedia>Mr. Stradivarius 0 start module with useful tools for dealing with Lua tables Scribunto text/plain -- This module includes a number of functions that can be useful when dealing with Lua tables. local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ----------------------------------------------------------------------------------- -- Helper functions ----------------------------------------------------------------------------------- --]] local function isPositiveInteger(num) -- Returns true if the given number is a positive integer, and false if not. if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ----------------------------------------------------------------------------------- -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ----------------------------------------------------------------------------------- --]] function p.compressSparseArray(t) local nums, ret = {}, {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end return p efbc83f9888f64eafdb5dde54c91061790a6434f 187 186 2013-12-15T11:33:51Z wikipedia>Mr. Stradivarius 0 add getNumKeys function and improve the comments, add the beginnings of a sparseIpairs function Scribunto text/plain -- This module includes a number of functions that can be useful when dealing with Lua tables. local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ----------------------------------------------------------------------------------- -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of the table. ----------------------------------------------------------------------------------- --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ----------------------------------------------------------------------------------- -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ----------------------------------------------------------------------------------- --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ----------------------------------------------------------------------------------- --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ----------------------------------------------------------------------------------- -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ----------------------------------------------------------------------------------- --]] -- function p.sparseIpairs(t) -- local nums = p.getNumKeys(t) return p 9fe2fe4d97e10950139175546b85b8d7de72512e 188 187 2013-12-15T11:45:54Z wikipedia>Mr. Stradivarius 0 finish sparseIpairs Scribunto text/plain -- This module includes a number of functions that can be useful when dealing with Lua tables. local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ----------------------------------------------------------------------------------- -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of the table. ----------------------------------------------------------------------------------- --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ----------------------------------------------------------------------------------- -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ----------------------------------------------------------------------------------- --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ----------------------------------------------------------------------------------- --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ----------------------------------------------------------------------------------- -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ----------------------------------------------------------------------------------- --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p abe732e01892eb91c21ad3c969ccef94712736d8 189 188 2013-12-15T12:43:19Z wikipedia>Mr. Stradivarius 0 add getAffixNums function Scribunto text/plain -- This module includes a number of functions that can be useful when dealing with Lua tables. local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ----------------------------------------------------------------------------------- -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of the table. ----------------------------------------------------------------------------------- --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ----------------------------------------------------------------------------------- -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ----------------------------------------------------------------------------------- --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ----------------------------------------------------------------------------------- --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ----------------------------------------------------------------------------------- --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ----------------------------------------------------------------------------------- -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ----------------------------------------------------------------------------------- --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p bf3475e434234bc14f9dae5c8bb42573df7fa763 190 189 2013-12-15T12:54:19Z wikipedia>Mr. Stradivarius 0 grammar Scribunto text/plain -- This module includes a number of functions that can be useful when dealing with Lua tables. local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ----------------------------------------------------------------------------------- -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ----------------------------------------------------------------------------------- --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ----------------------------------------------------------------------------------- -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ----------------------------------------------------------------------------------- --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ----------------------------------------------------------------------------------- --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ----------------------------------------------------------------------------------- -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ----------------------------------------------------------------------------------- --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ----------------------------------------------------------------------------------- -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ----------------------------------------------------------------------------------- --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p c902e0ec7c9891b2739d46d319d34cce6e39253a 191 190 2013-12-15T13:10:21Z wikipedia>Mr. Stradivarius 0 add a fancy introductory comment Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 6eaa7526e4f9606bd73fb8b0aba626695eb327dc 192 191 2013-12-15T13:30:27Z wikipedia>Mr. Stradivarius 0 add getUnion function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, 3, 5, bar = 6}, getUnion will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.getUnion(...) local arrays = {...} local vals, ret = {}, {} for _, t in ipairs(arrays) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 9f12730353a2bf3830886025612501a2c9e0b38c 193 192 2013-12-15T13:31:20Z wikipedia>Mr. Stradivarius 0 better variable name - getUnion deals with all tables, not just arrays Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, 3, 5, bar = 6}, getUnion will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.getUnion(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 1860a9b33b8de2429c1f8438b393417cee2dfbfa 194 193 2013-12-15T13:41:07Z wikipedia>Mr. Stradivarius 0 add getIntersection function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.getUnion(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- getIntersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.getIntersection(...) local tables = {...} local vals, ret = {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 8b7164a8a40ae7177d7a232c406e1fc8671d7789 195 194 2013-12-15T13:50:39Z wikipedia>Mr. Stradivarius 0 add missing ret table Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.getUnion(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- getIntersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.getIntersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) table.sort(nums) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 811ca3bd4d4a1b11be45b3293753d7ddb44a376a 196 195 2013-12-15T15:17:15Z wikipedia>Mr. Stradivarius 0 remove an unnecessary table.sort from compressSparseArray Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- getUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.getUnion(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- getIntersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.getIntersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- getNumKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.getNumKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- getAffixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.getAffixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.getNumKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.getNumKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 42b012c8d7924e27e0738953a9e5f6d8cd2441a1 197 196 2013-12-16T01:55:47Z wikipedia>Mr. Stradivarius 0 use fooBar for function names instead of getFooBar Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end table.sort(ret) return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p f1db6ee41a13067be36adcd54f561eeaf902c531 198 197 2013-12-16T01:58:04Z wikipedia>Mr. Stradivarius 0 don't sort union and intersection functions Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do vals[v] = true end end for val in pairs(vals) do ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p c59bb0211d08865b5cba48a1e6d5454b45eb2b47 199 198 2013-12-16T02:43:19Z wikipedia>Mr. Stradivarius 0 use a hack to handle NaN values Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$') if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 7cc74eaef323da0ea689c6c2851d359c090d66ef 200 199 2013-12-16T04:38:19Z wikipedia>Mr. Stradivarius 0 p.affixNums: move the pattern-generating code out of the loop Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local tables = {...} local vals, ret = {}, {} for _, t in ipairs(tables) do for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local tables = {...} local vals, ret = {}, {} local lim = #tables for _, t in ipairs(tables) do for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 525f03362f642cdb38cfb75d239f29d7882c907e 201 200 2013-12-16T14:08:04Z wikipedia>Mr. Stradivarius 0 use select rather than {...} Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local vals, ret = {}, {} local lim = #tables for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 1ecb023a2398d6a239199c60c3cc8a227e76de02 202 201 2013-12-16T14:09:55Z wikipedia>Mr. Stradivarius 0 fix lim variable in intersection function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.union(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p d8e15b9b54386f9d271925516d2f8fdc6031fd4f 203 202 2013-12-17T02:09:33Z wikipedia>Mr. Stradivarius 0 add key/value pair union function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] array[#array + 1] = v ret[k] = array else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p b32e55558fc6f5a3e2f980345a59f85080c9f77d Module:TableTools 828 7 204 203 2013-12-17T03:16:30Z wikipedia>Mr. Stradivarius 0 add a key/value pair intersection function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] array[#array + 1] = v ret[k] = array else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local differentVals = {} -- A substitute variable to use when we have different values for the same key. local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p c8a758fe202a28b8bdd08f5c046c4d38ab935b40 205 204 2013-12-17T03:19:39Z wikipedia>Mr. Stradivarius 0 remove a variable that I didn't use in the end Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] array[#array + 1] = v ret[k] = array else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p 660b9e6fb353f6121e07a76424f01aa635c06ed8 206 205 2013-12-17T06:02:39Z wikipedia>Mr. Stradivarius 0 check for existing values in p.union value arrays Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p cb3bc298bd5d7158e451a3544b3b857341c775b6 207 206 2013-12-17T06:34:55Z wikipedia>Mr. Stradivarius 0 add a break in p.union to maybe save us cycling through a loop or two Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end return p cdd15f8657cf436938010a69305879cc4e3037f5 208 207 2013-12-17T06:49:29Z wikipedia>Mr. Stradivarius 0 add a size function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) local i = 0 for k in pairs(t) do i = i + 1 end return i end return p b4b7f9dd3eb510ae27257415c789e095e25cbe3b 209 208 2013-12-17T06:57:30Z wikipedia>Mr. Stradivarius 0 add type checking Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 449bd4163929c13408a0da689d1dba576cd59aa8 210 209 2013-12-17T07:39:19Z wikipedia>Mr. Stradivarius on tour 0 check type of prefix and suffix Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local ret, trackArrays = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local vals, ret = {}, {} for i = 1, select('#', ...) do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local ret, track, pairCounts = {}, {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local vals, ret = {}, {} local lim = select('#', ...) for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 68b1d0c75b8cb2dd211ff5338d89a2abaa8bd737 211 210 2013-12-17T10:51:18Z wikipedia>Mr. Stradivarius 0 generate an error message when union and intersection functions are called with no arguments Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueIntersection'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p dc73fc82f1c46e0e11a32b2045b607dfe11872cf 212 211 2013-12-17T13:31:09Z wikipedia>Mr. Stradivarius 0 add a complement function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueIntersection'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end -- Now we know that we have at least two sets. local ret = select(lim, ...) checkType('complement', lim, ret, 'table') for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p bcfda7a7eff5d1e2dda8256ce5af6f788152031b 213 212 2013-12-17T14:42:36Z wikipedia>Mr. Stradivarius 0 clone tn rather than returning an altered tn Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given number is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(num) if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueIntersection'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end local valCount = vals[v] or 0 vals[v] = valCount + 1 end end for val, count in pairs(vals) do if count == lim then if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 1e8f52e8506239a70ac0396dbfa34331cad5e48e 214 213 2013-12-19T07:44:20Z wikipedia>Mr. Stradivarius 0 add isNan function, shallowClone function and removeDuplicates function, fix up valueIntersection function to work properly for NaNs Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'intersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p c148416a5d1a3d3e21d38f4af2c5b5c9dc6600a2 215 214 2013-12-19T14:13:45Z wikipedia>Mr. Stradivarius 0 valueIntersection: fix error message function name Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 4b0d48a45fd4df9f45955d033ffcfb8da6d87f95 216 215 2013-12-19T14:25:09Z wikipedia>Mr. Stradivarius 0 remove shallowClone - hardly worth having this in here Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType -- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. local nan = {} --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'valueUnion'", 2) end local vals, ret = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if type(v) == 'number' and tostring(v) == '-nan' then v = nan -- NaN cannot be a table key, so use a proxy variable. end vals[v] = true end end for val in pairs(vals) do if val == nan then -- This ensures that we output a NaN when we had one as input, although -- they may have been generated in a completely different way. val = 0/0 end ret[#ret + 1] = val end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 77d16c58518d5798e7ac1d681a909e6a1a29f3fb 217 216 2013-12-19T15:11:17Z wikipedia>Mr. Stradivarius 0 fix the valueUnion function for NaNs (and make it a lot simpler to boot) Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if isNan(v) then ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p b550aa08f87e338acb7eca34857f202ff1628c6f 218 217 2013-12-19T15:16:08Z wikipedia>Mr. Stradivarius 0 add type-checking to removeDuplicates Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'union'", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if isNan(v) then ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'intersection'", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim == 0 then error("no arguments passed to 'complement' (minimum is two)", 2) elseif lim == 1 then error("only one argument passed to 'complement' (minimum is two)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 6149b2b5b50df07b2dbe56bb5c159aeae676a6d3 219 218 2013-12-19T23:46:47Z wikipedia>Mr. Stradivarius 0 only allow two or more arguments for the set functions Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'union' (minimum is 2)", 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if isNan(v) then ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'intersection' (minimum is 2)", 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim < 2 then error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'complement' (minimum is 2)", 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p d0070589e44db7fe1eb6dd40e1dd7b3b2f29ff21 220 219 2013-12-20T01:17:23Z wikipedia>Mr. Stradivarius 0 better error message for the set functions Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'union' (minimum is 2, received " .. lim .. ')', 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'valueUnion' (minimum is 2, received " .. lim .. ')', 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if isNan(v) then ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'intersection' (minimum is 2, received " .. lim .. ')', 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'valueIntersection' (minimum is 2, received " .. lim .. ')', 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'complement' (minimum is 2, received " .. lim .. ')', 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = {} for k, v in pairs(tn) do ret[k] = v end -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 34cd33c5fda1aa122dcd43fd53f277a131f9ea38 221 220 2013-12-20T01:51:19Z wikipedia>Mr. Stradivarius 0 reinstate shallowClone - saw a use for it in p.complement - and write p.valueComplement Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- union -- -- This returns the union of the key/value pairs of n tables. If any of the tables -- contain different values for the same table key, the table value is converted -- to an array holding all of the different values. ------------------------------------------------------------------------------------ --]] function p.union(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'union' (minimum is 2, received " .. lim .. ')', 2) end local ret, trackArrays = {}, {} for i = 1, lim do local t = select(i, ...) checkType('union', i, t, 'table') for k, v in pairs(t) do local retKey = ret[k] if retKey == nil then ret[k] = v elseif retKey ~= v then if trackArrays[k] then local array = ret[k] local valExists for _, arrayVal in ipairs(array) do if arrayVal == v then valExists = true break end end if not valExists then array[#array + 1] = v ret[k] = array end else ret[k] = {ret[k], v} trackArrays[k] = true end end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueUnion -- -- This returns the union of the values of n tables, as an array. For example, for -- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return -- {1, 2, 3, 4, 5, 6, 7}. ------------------------------------------------------------------------------------ --]] function p.valueUnion(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'valueUnion' (minimum is 2, received " .. lim .. ')', 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim do local t = select(i, ...) checkType('valueUnion', i, t, 'table') for k, v in pairs(t) do if isNan(v) then ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- intersection -- -- This returns the intersection of the key/value pairs of n tables. Both the key -- and the value must match to be included in the resulting table. ------------------------------------------------------------------------------------ --]] function p.intersection(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'intersection' (minimum is 2, received " .. lim .. ')', 2) end local ret, track, pairCounts = {}, {}, {} for i = 1, lim do local t = select(i, ...) checkType('intersection', i, t, 'table') for k, v in pairs(t) do local trackVal = track[k] if trackVal == nil then track[k] = v pairCounts[k] = 1 elseif trackVal == v then pairCounts[k] = pairCounts[k] + 1 end end end for k, v in pairs(track) do if pairCounts[k] == lim then ret[k] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueIntersection -- -- This returns the intersection of the values of n tables, as an array. For -- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, -- intersection will return {3, 5}. ------------------------------------------------------------------------------------ --]] function p.valueIntersection(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'valueIntersection' (minimum is 2, received " .. lim .. ')', 2) end local isNan = p.isNan local vals, ret = {}, {} local isSameTable = true -- Tracks table equality. local tableTemp -- Used to store the table from the previous loop so that we can check table equality. for i = 1, lim do local t = select(i, ...) checkType('valueIntersection', i, t, 'table') if tableTemp and t ~= tableTemp then isSameTable = false end tableTemp = t for k, v in pairs(t) do -- NaNs are never equal to any other value, so they can't be in the intersection. -- Which is lucky, as they also can't be table keys. if not isNan(v) then local valCount = vals[v] or 0 vals[v] = valCount + 1 end end end if isSameTable then -- If all the tables are equal, then the intersection is that table (including NaNs). -- All we need to do is convert it to an array and remove duplicate values. for k, v in pairs(tableTemp) do ret[#ret + 1] = v end return p.removeDuplicates(ret) end for val, count in pairs(vals) do if count == lim then ret[#ret + 1] = val end end return ret end --[[ ------------------------------------------------------------------------------------ -- complement -- -- This returns the relative complement of t1, t2, ..., in tn. The complement -- is of key/value pairs. This is equivalent to all the key/value pairs that are in -- tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.complement(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'complement' (minimum is 2, received " .. lim .. ')', 2) end --[[ -- Now we know that we have at least two sets. -- First, get all the key/value pairs in tn. We can't simply make ret equal to tn, -- as that will affect the value of tn for the whole module. --]] local tn = select(lim, ...) checkType('complement', lim, tn, 'table') local ret = p.shallowClone(tn) -- Remove all the key/value pairs in t1, t2, ..., tn-1. for i = 1, lim - 1 do local t = select(i, ...) checkType('complement', i, t, 'table') for k, v in pairs(t) do if ret[k] == v then ret[k] = nil end end end return ret end --[[ ------------------------------------------------------------------------------------ -- valueComplement -- -- This returns an array containing the relative complement of t1, t2, ..., in tn. -- The complement is of values only. This is equivalent to all the values that are -- in tn but are not in t1, t2, ... tn-1. ------------------------------------------------------------------------------------ --]] function p.valueComplement(...) local lim = select('#', ...) if lim < 2 then error("too few arguments to 'valueComplement' (minimum is 2, received " .. lim .. ')', 2) end local isNan = p.isNan local ret, exists = {}, {} for i = 1, lim - 1 do local t = select(i, ...) checkType('valueComplement', i, t, 'table') for k, v in pairs(t) do if not isNan(v) then -- NaNs cannot be table keys, and they are also unique so cannot be equal to anything in tn. exists[v] = true end end end local tn = select(lim, ...) checkType('valueComplement', lim, tn, 'table') for k, v in pairs(tn) do if isNan(v) or exists[v] == nil then ret[#ret + 1] = v end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 2921b35aaa107c930eb961ad4dd20ae7e2ed846a 222 221 2013-12-20T05:46:35Z wikipedia>Mr. Stradivarius 0 split set functions out to [[Module:Set]] Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 0321ffb06a12ed081b6a7a56ec068a86a5f116b4 223 222 2013-12-20T06:14:43Z wikipedia>Mr. Stradivarius 0 Protected Module:TableTools: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 0321ffb06a12ed081b6a7a56ec068a86a5f116b4 224 223 2013-12-24T23:47:45Z wikipedia>Mr. Stradivarius 0 sparseIpairs: return nil explicitly if i > lim Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p ce94a73466db359812c7e69f6f70534b91f7de6d 225 224 2013-12-27T05:13:33Z wikipedia>Mr. Stradivarius 0 add p.numData function Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) prefix = prefix or '' suffix = suffix or '' local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 707fe2ac1c95295e777709a18eada590718254c3 226 225 2013-12-27T05:57:19Z wikipedia>Mr. Stradivarius 0 escape prefix and suffix strings in affixNums so that magic characters are interpreted literally Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([()%%.%[%]*+-?^$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p 53f82b02799da91c7cf31d92c6a90362f54ee9a8 Module:Arguments 828 2 13 12 2013-12-18T00:51:27Z wikipedia>Mr. Stradivarius 0 Changed protection level of Module:Arguments: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them. local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) -- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions -- depending on the options chosen. This is so that we don't have to call the options table every time the function is called. local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. -- We are also memoizing nil values, but those values can be overwritten. for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the -- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase -- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we -- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and -- pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2) elseif options.noOverwrite and args[key] ~= nil then error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments e6db5f78210f2802c5d52b2b532df4f171dc9ba7 14 13 2014-01-12T21:00:02Z wikipedia>Anomie 0 Fix __pairs and __ipairs functions to handle the nil marker Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them. local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) -- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions -- depending on the options chosen. This is so that we don't have to call the options table every time the function is called. local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precendence. -- We are also memoizing nil values, but those values can be overwritten. for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the -- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase -- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we -- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and -- pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2) elseif options.noOverwrite and args[key] ~= nil then error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return function ( t, k ) local nk, val = next( metaArgs, k ) if val == nilArg then val = nil end return nk, val end end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return function ( t, i ) local val = metaArgs[i + 1] if val == nil then return nil elseif val == nilArg then val = nil end return i + 1, val end, nil, 0 end return args end return arguments 645cae8abf59202ac8b85cd1faa735e5706153cc 15 14 2014-01-13T05:40:58Z wikipedia>Mr. Stradivarius 0 tweak one of the comments and make some beautification fixes, now that this is in the job queue Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from #invoke. -- It is intended for use by other Lua modules, and should not be called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} -- Get the arguments from the frame object if available. If the frame object is not available, we are being called -- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them. local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. -- The metatable connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) -- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions -- depending on the options chosen. This is so that we don't have to call the options table every time the function is called. local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) -- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator. -- If a value is already present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, but those values can be overwritten. for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, -- which is how we avoid clashes between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the -- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase -- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we -- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and -- pargs if pairs has already been run, as all the arguments will already have been copied over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if val ~= nil then if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2) elseif options.noOverwrite and args[key] ~= nil then error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return function (t, k) local nk, val = next(metaArgs, k) if val == nilArg then val = nil end return nk, val end end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return function (t, i) local val = metaArgs[i + 1] if val == nil then return nil elseif val == nilArg then val = nil end return i + 1, val end, nil, 0 end return args end return arguments f3df27bc7c79c43ca6ac1382b201eb78988113bd Template:Infobox 10 11 584 583 2014-01-10T22:59:03Z wikipedia>Kaldari 0 wikitext text/x-wiki {| class="infobox" style="width: 22em;" |- ! colspan="2" style="font-size: larger;" | {{{name}}} |- | colspan="2" style="text-align: center;" | {{{image}}}<br/>{{{caption}}} |- style="vertical-align: top;" ! Data 1 | {{{data 1}}} |- style="vertical-align: top;" ! Data 2 | {{{data 2}}} |- style="vertical-align: top;" ! Data 3 | {{{data 3}}} |- style="vertical-align: top;" ! Data 4 | {{{data 4}}} |- style="vertical-align: top;" | colspan="2" style="font-size: smaller;" | {{footnote}} |} f9be0bac5d7440a6f82a1b785e010a6d55861ceb 585 584 2014-01-10T23:01:27Z wikipedia>Nihiltres 0 Undid revision 590143379 by [[Special:Contributions/Kaldari|Kaldari]] ([[User talk:Kaldari|talk]]); breaks everything wikitext text/x-wiki {{#invoke:Infobox|infobox}}<noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> adcda4ac544f8af340cf47833dc2960631593988 Module:Message box 828 4 105 104 2014-01-27T01:04:43Z wikipedia>Mr. Stradivarius 0 fix bug for data being shared between multiple message boxes called from the same module; allow boxes to be hidden; use [[Module:Arguments]] to fetch the arguments Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local getArgs = require('Module:Arguments').getArgs local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(page, ...) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page, ...) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local box = {} box.__index = box function box.new() local obj = {} setmetatable(obj, box) return obj end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end if yesno(args.hidden) then self:addClass('infobox editsection') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set, -- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false end -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank. and self.templateTitle and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle)) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading, -- and make a link to the talk page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) local outputBox = box.new() outputBox:setTitle(args) local cfg = outputBox:getConfig(boxType) args = outputBox:removeBlankArgs(cfg, args) outputBox:setBoxParameters(cfg, args) return outputBox:export() end local function makeWrapper(boxType) return function (frame) local args = getArgs(frame, {trim = false, removeBlanks = false}) return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p b6ed0be73aee41a2c85a2b2a053a418a27685815 106 105 2014-02-22T12:44:58Z wikipedia>AGK 0 spread comment over two lines, as modules do not wrap lines Scribunto text/plain -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, -- {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local getArgs = require('Module:Arguments').getArgs local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(page, ...) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page, ...) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local box = {} box.__index = box function box.new() local obj = {} setmetatable(obj, box) return obj end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ')) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks') for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end if yesno(args.hidden) then self:addClass('infobox editsection') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set, -- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false end -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank. and self.templateTitle and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle)) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading, -- and make a link to the talk page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText) else talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box types other than ambox, -- and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat('main', 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image is inside it. -- Divs use style="width: 52px;", which limits the image width to 52px. If any -- images in a div are wider than that, they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and some don't. -- The old template code in templates where empty cells are specified gives the following hint: -- "No image. Cell with some width or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be collapsible. At the -- moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it. end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '')) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) local outputBox = box.new() outputBox:setTitle(args) local cfg = outputBox:getConfig(boxType) args = outputBox:removeBlankArgs(cfg, args) outputBox:setBoxParameters(cfg, args) return outputBox:export() end local function makeWrapper(boxType) return function (frame) local args = getArgs(frame, {trim = false, removeBlanks = false}) return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p 32ad0502147b405ede9ef5275f1726d95a183107 Module:Message box/configuration 828 5 146 145 2014-01-27T01:07:32Z wikipedia>Mr. Stradivarius 0 allow the hidden arg to be blank, and allow tmbox to have an id attribute, per protected edit request by [[User:Technical 13]] Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowId = true, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 99308172edb557860d5d09a580d88c4b8318a567 Module:Namespace detect/config 828 26 862 2014-03-20T13:56:40Z wikipedia>Mr. Stradivarius 0 create separate configuration page for [[Module:Namespace detect]] Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to -- cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding -- subject namespace. Note that this parameter is used with [[Module:Yesno]]. -- Edit that module to change the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of -- possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space -- parameters. cfg.wikitableAliasesHeader = 'Aliases' return cfg 56c8f8aa85bd99c7757fba9af23c9d2ab1c8b939 863 862 2014-03-22T13:11:09Z wikipedia>Mr. Stradivarius 0 make comments more informative, and document the possibility to add parameter as an array Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: -- cfg.page = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. c91e089f4629ec18ed7b1bf5422daaaa1490066d 864 863 2014-03-22T13:14:03Z wikipedia>Mr. Stradivarius 0 test new config system Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: cfg.main = {'foo', 'bar'} ---- This parameter displays in talk namespaces: cfg.talk = 'baz' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: -- cfg.page = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 77022a15fbd3b0003e5aa7f8b3322a50ecbf9a29 865 864 2014-03-22T13:15:55Z wikipedia>Mr. Stradivarius 0 Undid revision 600728866 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) seems to be working Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: -- cfg.page = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. c91e089f4629ec18ed7b1bf5422daaaa1490066d 866 865 2014-03-24T11:48:17Z wikipedia>Mr. Stradivarius 0 Protected Module:Namespace detect/config: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: -- cfg.page = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. c91e089f4629ec18ed7b1bf5422daaaa1490066d Module:Namespace detect/data 828 24 824 2014-03-20T15:47:15Z wikipedia>Jackmcbarn 0 [[WP:AES|←]]Created page with '---------------------------------------------------------------------------------------------------- -- Configuration da...' Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local function getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { cfg = cfg, paramMappings = getParamMappings() } cf6fe61aeb9468f91db0e4b7c47a6c600693416d 825 824 2014-03-20T15:49:12Z wikipedia>Jackmcbarn 0 no sense wrapping this Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local function getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return cfg, getParamMappings() e8b691ac135997750856996a28bd362e2e290dae 826 825 2014-03-20T15:52:05Z wikipedia>Jackmcbarn 0 okay, it needs wrapping after all Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local function getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { cfg, getParamMappings() } bbc3b32e0920e04b39c400e344f0ada0fc975de5 827 826 2014-03-20T16:02:00Z wikipedia>Jackmcbarn 0 name return values Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names can be set here. -- ---------------------------------------------------------------------------------------------------- local cfg = {} -- This parameter displays content for the main namespace: cfg.main = 'main' -- This parameter displays in talk namespaces: cfg.talk = 'talk' -- This parameter displays content for "other" namespaces (namespaces for which -- parameters have not been specified, or for when cfg.demospace is set to cfg.other): cfg.other = 'other' -- This parameter makes talk pages behave as though they are the corresponding subject namespace. -- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change -- the default values of "yes", "no", etc. cfg.subjectns = 'subjectns' -- This parameter sets a demonstration namespace: cfg.demospace = 'demospace' -- This parameter sets a specific page to compare: cfg.page = 'page' -- The header for the namespace column in the wikitable containing the list of possible subject-space parameters. cfg.wikitableNamespaceHeader = 'Namespace' -- The header for the wikitable containing the list of possible subject-space parameters. cfg.wikitableAliasesHeader = 'Aliases' ---------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------- local function getParamMappings() --[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace names, in lower case, and the values are the possible parameter names for that namespace, also in lower case. The table entries are structured like this: { [''] = {'main'}, ['wikipedia'] = {'wikipedia', 'project', 'wp'}, ... } ]] local mappings = {} mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { cfg = cfg, mappings = getParamMappings() } 5dffd9afa1edfcfee618fb1689e14e36b3aa3940 828 827 2014-03-21T03:13:45Z wikipedia>Mr. Stradivarius 0 use a dedicated config page - [[Module:Namespace detect/config]] - for configuration data, and try and reduce unnecessary table lookups in the getParamMappings function Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local ustringLower = mw.ustring.lower local tinsert = table.insert local subjectNamespaces = mw.site.subjectNamespaces local talk = cfg.talk local mappings = {} mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main} mappings[talk] = {talk} for nsid, ns in pairs(subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ustringLower(ns.name) local canonicalName = ustringLower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then tinsert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do tinsert(mappings[nsname], ustringLower(alias)) end end end return mappings end return {cfg = cfg, mappings = getParamMappings()} 2df940e5bd9fc6a81bc94871960f03e8dbad1150 829 828 2014-03-21T19:04:15Z wikipedia>Jackmcbarn 0 IMO, aliasing variables like that makes readability worse Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} mappings[mw.ustring.lower(mw.site.subjectNamespaces[0].name)] = {cfg.main} mappings[cfg.talk] = {cfg.talk} for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return {cfg = cfg, mappings = getParamMappings()} 6d6ad28ac73d4fc1d8116f51e6c9de9f6ec329d1 830 829 2014-03-21T19:06:53Z wikipedia>Jackmcbarn 0 Undid revision 600634263 by [[Special:Contributions/Jackmcbarn|Jackmcbarn]] ([[User talk:Jackmcbarn|talk]]): Oh, this seems to have been for performance. Still not sure if it's a good idea, but will leave for now Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local ustringLower = mw.ustring.lower local tinsert = table.insert local subjectNamespaces = mw.site.subjectNamespaces local talk = cfg.talk local mappings = {} mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main} mappings[talk] = {talk} for nsid, ns in pairs(subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ustringLower(ns.name) local canonicalName = ustringLower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then tinsert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do tinsert(mappings[nsname], ustringLower(alias)) end end end return mappings end return {cfg = cfg, mappings = getParamMappings()} 2df940e5bd9fc6a81bc94871960f03e8dbad1150 831 830 2014-03-22T06:41:09Z wikipedia>Mr. Stradivarius 0 add a getArgKeys function, so that we can have multiple keys for each argument (helpful for localisation) and so that we only have to create that table once per page Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end local function getArgKeys() -- Returns a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end return argKeys end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local ustringLower = mw.ustring.lower local tinsert = table.insert local subjectNamespaces = mw.site.subjectNamespaces local talk = cfg.talk local mappings = {} mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main} mappings[talk] = {talk} for nsid, ns in pairs(subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ustringLower(ns.name) local canonicalName = ustringLower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then tinsert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do tinsert(mappings[nsname], ustringLower(alias)) end end end return mappings end return { argKeys = getArgKeys(), cfg = cfg, mappings = getParamMappings() } 093c07d09da973eec6a1f2684ddb2a410af66bb9 832 831 2014-03-22T07:03:48Z wikipedia>Mr. Stradivarius 0 give the argKeys table global scope so that getParamMappings can access it without having to process the cfg table again Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local ustringLower = mw.ustring.lower local tinsert = table.insert local clone = mw.clone local subjectNamespaces = mw.site.subjectNamespaces local mappings = {} mappings[ustringLower(subjectNamespaces[0].name)] = clone(argKeys.main) mappings['talk'] = clone(argKeys.talk) for nsid, ns in pairs(subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ustringLower(ns.name) local canonicalName = ustringLower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then tinsert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do tinsert(mappings[nsname], ustringLower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } c7aa2bf69206bf3835cf984d43d5353f3418a108 833 832 2014-03-24T11:36:17Z wikipedia>Mr. Stradivarius 0 avoid using local variables to save table lookups per Jackmcbarn's suggestion, and because this will be cached with mw.loadData so performance of this function is not such a worry Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ns.name local canonicalName = ns.canonicalName mappings[nsname] = {mw.ustring.lower(nsname)} if canonicalName ~= nsname then table.insert(mappings[nsname], mw.ustring.lower(canonicalName)) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } b58fcd746b637dcc1d568a9f028d647a521db6dc 834 833 2014-03-24T11:37:34Z wikipedia>Mr. Stradivarius 0 Undid revision 601018314 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) looks like that broke something Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local ustringLower = mw.ustring.lower local tinsert = table.insert local clone = mw.clone local subjectNamespaces = mw.site.subjectNamespaces local mappings = {} mappings[ustringLower(subjectNamespaces[0].name)] = clone(argKeys.main) mappings['talk'] = clone(argKeys.talk) for nsid, ns in pairs(subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = ustringLower(ns.name) local canonicalName = ustringLower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then tinsert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do tinsert(mappings[nsname], ustringLower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } c7aa2bf69206bf3835cf984d43d5353f3418a108 835 834 2014-03-24T11:43:58Z wikipedia>Mr. Stradivarius 0 found it - mappings[nsname] was getting an upper-case key Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } 55a03e95ca1c5d2bbd446a58d647cd392d5bdd5f 836 835 2014-03-24T11:45:45Z wikipedia>Mr. Stradivarius 0 Protected Module:Namespace detect/data: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'page'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } 55a03e95ca1c5d2bbd446a58d647cd392d5bdd5f Module:Category handler/config 828 22 796 2014-03-24T05:20:06Z wikipedia>Mr. Stradivarius 0 copy config data from [[Module:Category handler]] to try and make the separation between config and code clearer Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- 41553683badfcf1cb803cd1f411ca5c55ea69a2c Module:Namespace detect 828 25 859 858 2014-03-24T11:54:00Z wikipedia>Mr. Stradivarius 0 cache mappings using mw.loadData to increase performance, enable multiple parameter config values, switch p.main to [[Module:Arguments]] so arguments are only processed when necessary, streamline p._main code, and other minor fixes Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.page) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p cfb002544ed5936b765e61f6de97d5b3ff8f5eab 860 859 2014-04-05T17:01:23Z wikipedia>Mr. Stradivarius 0 use demopage instead of page as the main "page" parameter Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p a4757000273064f151f0f22dc0e139092e5ff443 Module:Namespace detect/config 828 26 867 866 2014-04-05T05:39:37Z wikipedia>Mr. Stradivarius 0 make "page" an optional parameter - needed to fix bug on en.wikisource where "Page" is a namespace name Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.page = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 394aa4b50db80889f7090096a47693bb7968a745 868 867 2014-04-05T17:03:49Z wikipedia>Mr. Stradivarius 0 use cfg.demopage rather than cfg.page now that the default parameter has been changed on the /data page Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/data 828 24 837 836 2014-04-05T05:40:57Z wikipedia>Mr. Stradivarius 0 use "demopage" instead of "page" as the default page parameter - needed to fix bug on en.wikisource where "Page" is a namespace name Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local argKeys = { main = {'main'}, talk = {'talk'}, other = {'other'}, subjectns = {'subjectns'}, demospace = {'demospace'}, page = {'demopage'} } for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } 439109a154c03e1e23608107cbcd8f6a7244121c 838 837 2014-04-05T17:02:16Z wikipedia>Mr. Stradivarius 0 bug fix - use the demospace parameter as both key and value in the argKeys table Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:Category handler/config 828 22 797 796 2014-04-07T16:03:37Z wikipedia>Mr. Stradivarius 0 return the cfg table Scribunto text/plain ---------------------------------------------------------------------------------------------------------- -- Configuration data -- -- Language-specific parameter names and values can be set here. -- ---------------------------------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. ---------------------------------------------------------------------------------------------------------- -- Start configuration data -- ---------------------------------------------------------------------------------------------------------- -- The following config values set the names of parameters that suppress categorisation. They are used -- with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the -- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to -- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the namespace that is detected. This -- must be the same as the cfg.other parameter in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used for testing and -- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised. -- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.) -- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the format of parameter -- names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } ---------------------------------------------------------------------------------------------------------- -- End configuration data -- ---------------------------------------------------------------------------------------------------------- return cfg -- Don't edit this line. bf36971f585450669ece7ff761671c26edc5f5f4 798 797 2014-04-07T16:08:24Z wikipedia>Mr. Stradivarius 0 make this fit within 80 chars Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -- The following config values set the names of parameters that suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and the -- blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and the -- blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses categorisation -- if present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative. cfg.category2 = 'category2' cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- cfg.subpage is the parameter name to specify how to behave on subpages. -- cfg.subpageNo is the value to specify to not categorise on subpages; cfg.only -- is the value to specify to only categorise on subpages. cfg.subpage = 'subpage' cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -- The parameter for data to return in all namespaces. cfg.all = 'all' -- The parameter name for data to return if no data is specified for the -- namespace that is detected. This must be the same as the cfg.other parameter -- in [[Module:Namespace detect]]. cfg.other = 'other' -- The parameter name used to specify a page other than the current page; used -- for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. cfg.page = 'page' -- The categorisation blacklist. Pages that match Lua patterns in this list will -- not be categorised. (However, see the explanation of cfg.nocat, -- cfg.categories and cfg.category2 for some exceptions.) If the namespace name -- has a space in, it must be written with an underscore, e.g. "Wikipedia_talk". -- Other parts of the title can have either underscores or spaces. cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } -- This is a table of namespaces to categorise by default. They should be in the -- format of parameter names accepted by [[Module:Namespace detect]]. cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0512db5e2c3300318eaf31550c73c42a1681285a 799 798 2014-04-07T17:59:47Z wikipedia>Mr. Stradivarius 0 restructure, make most config optional, and add a few items to the blacklist Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- The nocat and categories parameter suppress ---- categorisation. They are used with Module:Yesno, and work as follows: ---- ---- cfg.nocat: ---- Result of yesno(args[cfg.nocat]) Effect ---- true Categorisation is suppressed ---- false Categorisation is allowed, and the ---- blacklist check is skipped ---- nil Categorisation is allowed ---- ---- cfg.categories: ---- Result of yesno(args[cfg.categories]) Effect ---- true Categorisation is allowed, and the ---- blacklist check is skipped ---- false Categorisation is suppressed ---- nil Categorisation is allowed -- cfg.nocat = 'nocat' -- cfg.categories = 'categories' ---- The parameter name for the legacy "category2" parameter. This skips the ---- blacklist if set to the cfg.category2Yes value, and suppresses ---- categorisation if present but equal to anything other than cfg.category2Yes ---- or cfg.category2Negative. -- cfg.category2 = 'category2' ---- cfg.subpage is the parameter name to specify how to behave on subpages. -- cfg.subpage = 'subpage' ---- The parameter for data to return in all namespaces. -- cfg.all = 'all' ---- The parameter name for data to return if no data is specified for the ---- namespace that is detected. -- cfg.other = 'other' ---- The parameter name used to specify a page other than the current page; used ---- for testing and demonstration. This must be the same as the cfg.page ---- parameter in [[Module:Namespace detect]]. cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- ---- The following settings are used with the cfg.category2 parameter. Setting ---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 ---- is present but equal to anything other than cfg.category2Yes or ---- cfg.category2Negative then it supresses cateogrisation. -- cfg.category2Yes = 'yes' -- cfg.category2Negative = '¬' ---- The following settings are used with the cfg.subpage parameter. ---- cfg.subpageNo is the value to specify to not categorise on subpages; ---- cfg.subpageOnly is the value to specify to only categorise on subpages. -- cfg.subpageNo = 'no' -- cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Blacklist -- -- The categorisation blacklist. Pages that match Lua patterns in this list -- -- will not be categorised. (However, see the explanation of cfg.nocat, -- -- cfg.categories and cfg.category2 for some exceptions.) If the namespace -- -- name has a space in, it must be written with an underscore, e.g. -- -- "Wikipedia_talk". Other parts of the title can have either underscores or -- -- spaces. -- -------------------------------------------------------------------------------- cfg.blacklist = { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User_talk:UBX$', '^User_talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', -- Don't categorise User CSD logs or PROD logs. '^User:.*/[cC][sS][dD] ?[lL][oO][gG]', '^User:.*/[pP][rR][oO][dD] ?[lL][oO][gG]', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive", "^Wikipedia:Administrators' noticeboard/3RRArchive", } -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 84d0b0f0f5eb378d9e8db875614a0a62e0d3cfae 800 799 2014-04-10T06:44:30Z wikipedia>Mr. Stradivarius 0 blacklist tweaks Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- The nocat and categories parameter suppress ---- categorisation. They are used with Module:Yesno, and work as follows: ---- ---- cfg.nocat: ---- Result of yesno(args[cfg.nocat]) Effect ---- true Categorisation is suppressed ---- false Categorisation is allowed, and the ---- blacklist check is skipped ---- nil Categorisation is allowed ---- ---- cfg.categories: ---- Result of yesno(args[cfg.categories]) Effect ---- true Categorisation is allowed, and the ---- blacklist check is skipped ---- false Categorisation is suppressed ---- nil Categorisation is allowed -- cfg.nocat = 'nocat' -- cfg.categories = 'categories' ---- The parameter name for the legacy "category2" parameter. This skips the ---- blacklist if set to the cfg.category2Yes value, and suppresses ---- categorisation if present but equal to anything other than cfg.category2Yes ---- or cfg.category2Negative. -- cfg.category2 = 'category2' ---- cfg.subpage is the parameter name to specify how to behave on subpages. -- cfg.subpage = 'subpage' ---- The parameter for data to return in all namespaces. -- cfg.all = 'all' ---- The parameter name for data to return if no data is specified for the ---- namespace that is detected. -- cfg.other = 'other' ---- The parameter name used to specify a page other than the current page; used ---- for testing and demonstration. This must be the same as the cfg.page ---- parameter in [[Module:Namespace detect]]. cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- ---- The following settings are used with the cfg.category2 parameter. Setting ---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 ---- is present but equal to anything other than cfg.category2Yes or ---- cfg.category2Negative then it supresses cateogrisation. -- cfg.category2Yes = 'yes' -- cfg.category2Negative = '¬' ---- The following settings are used with the cfg.subpage parameter. ---- cfg.subpageNo is the value to specify to not categorise on subpages; ---- cfg.subpageOnly is the value to specify to only categorise on subpages. -- cfg.subpageNo = 'no' -- cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Blacklist -- -- The categorisation blacklist. Pages that match Lua patterns in this list -- -- will not be categorised. (However, see the explanation of cfg.nocat, -- -- cfg.categories and cfg.category2 for some exceptions.) If the namespace -- -- name has a space in, it must be written with an underscore, e.g. -- -- "Wikipedia_talk". Other parts of the title can have either underscores or -- -- spaces. -- -------------------------------------------------------------------------------- cfg.blacklist = { -- Don't categorise the Main Page. '^Main Page$', -- Don't categorise [[Wikipedia:Cascade-protected items]] or its subpages. -- The pattern '%f[/\0]' matches a blank string where the next character is -- either '/' or the end of the string, and the previous character is not -- one of those characters. '^Wikipedia:Cascade%-protected items%f[/\0]', -- Don't categorise [[User:UBX]], [[User talk:UBX]] or any of their -- subpages. This is the userbox "template" space, and often gets -- categorised with userbox categories by mistake. '^User:UBX%f[/\0]', '^User_talk:UBX%f[/\0]', -- Don't categorise subpages of [[Wikipedia:Template messages]], but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', -- Don't categorise User CSD logs or PROD logs. '^User:.*/[cC][sS][dD] ?[lL][oO][gG]', '^User:.*/[pP][rR][oO][dD] ?[lL][oO][gG]', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive", "^Wikipedia:Administrators' noticeboard/3RRArchive", } -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. cc198f1f9e228b46c04f2174c18e16be27f3e354 801 800 2014-07-07T01:55:54Z wikipedia>Mr. Stradivarius 0 don't bother to use default parameter names - allow each wiki to set parameter names however they want Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- The nocat and categories parameter suppress ---- categorisation. They are used with Module:Yesno, and work as follows: ---- ---- cfg.nocat: ---- Result of yesno(args[cfg.nocat]) Effect ---- true Categorisation is suppressed ---- false Categorisation is allowed, and the ---- blacklist check is skipped ---- nil Categorisation is allowed ---- ---- cfg.categories: ---- Result of yesno(args[cfg.categories]) Effect ---- true Categorisation is allowed, and the ---- blacklist check is skipped ---- false Categorisation is suppressed ---- nil Categorisation is allowed cfg.nocat = 'nocat' cfg.categories = 'categories' ---- The parameter name for the legacy "category2" parameter. This skips the ---- blacklist if set to the cfg.category2Yes value, and suppresses ---- categorisation if present but equal to anything other than cfg.category2Yes ---- or cfg.category2Negative. cfg.category2 = 'category2' ---- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpage = 'subpage' ---- The parameter for data to return in all namespaces. cfg.all = 'all' ---- The parameter name for data to return if no data is specified for the ---- namespace that is detected. cfg.other = 'other' ---- The parameter name used to specify a page other than the current page; used ---- for testing and demonstration. This must be the same as the cfg.page ---- parameter in [[Module:Namespace detect]]. cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- ---- The following settings are used with the cfg.category2 parameter. Setting ---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 ---- is present but equal to anything other than cfg.category2Yes or ---- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' ---- The following settings are used with the cfg.subpage parameter. ---- cfg.subpageNo is the value to specify to not categorise on subpages; ---- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 8063c443f965ea87c4b6f3feb7bb0cc5df05f315 802 801 2014-07-07T07:03:44Z wikipedia>Mr. Stradivarius 0 move parameter names to a cfg.parameters subtable Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 69057070efaff88f214b7b8e111b777ec1fb5c1d 803 802 2014-07-07T07:04:39Z wikipedia>Mr. Stradivarius 0 tweak parameter comments Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { 'main', 'file', 'help', 'category' } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 7ec4d1bda8286d0fff2a46762bee6325c89226b8 804 803 2014-07-07T14:37:14Z wikipedia>Mr. Stradivarius 0 use namespace numbers for the default namespaces Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 4] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 40471bde6ae068c5396f4c4743b4e61e1998d003 805 804 2014-07-07T23:57:08Z wikipedia>Mr. Stradivarius 0 that must be the other file namespace Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. b8798b5021912f0ea88511c840807597621f9fc3 806 805 2014-07-08T02:09:08Z wikipedia>Mr. Stradivarius 0 add wrappers config Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno(args[cfg.nocat]) Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno(args[cfg.categories]) Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. This must be the same as the cfg.page -- parameter in [[Module:Namespace detect]]. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -- -- These settings are optional. It is always possible to use the module -- -- defaults instead. -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. They should be in -- -- the format of parameter names accepted by [[Module:Namespace detect]]. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 32e097634f44fa3e4ab832c353d337ee7c1864fa 807 806 2014-07-08T05:27:50Z wikipedia>Mr. Stradivarius 0 update comments Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d 808 807 2014-07-13T09:05:36Z wikipedia>Mr. Stradivarius 0 Protected Module:Category handler/config: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d Module:Message box 828 4 107 106 2014-04-08T04:39:12Z wikipedia>Mr. Stradivarius 0 Allow passing attributes per protected edit request by [[User:Jackmcbarn]]. Also remove undocumented "hidden" parameter and format the module so it mostly fits within 80 chars. Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Require necessary modules. local getArgs = require('Module:Arguments').getArgs local htmlBuilder = require('Module:HtmlBuilder') local categoryHandler = require('Module:Category handler').main local yesno = require('Module:Yesno') -- Load the configuration page. local cfgTables = mw.loadData('Module:Message box/configuration') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Set aliases for often-used functions to reduce table lookups. local format = mw.ustring.format local tinsert = table.insert local tconcat = table.concat local trim = mw.text.trim -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(page, ...) if type(page) == 'string' then -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, page, ...) if success then return title end end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do tinsert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then tinsert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local box = {} box.__index = box function box.new() local obj = {} setmetatable(obj, box) return obj end function box.getNamespaceId(ns) if not ns then return end if type(ns) == 'string' then ns = lang:ucfirst(mw.ustring.lower(ns)) if ns == 'Main' then ns = 0 end end local nsTable = mw.site.namespaces[ns] if nsTable then return nsTable.id end end function box.getMboxType(nsid) -- Gets the mbox type from a namespace number. if nsid == 0 then return 'ambox' -- main namespace elseif nsid == 6 then return 'imbox' -- file namespace elseif nsid == 14 then return 'cmbox' -- category namespace else local nsTable = mw.site.namespaces[nsid] if nsTable and nsTable.isTalk then return 'tmbox' -- any talk namespace else return 'ombox' -- other namespaces or invalid input end end end function box:addCat(ns, cat, sort) if type(cat) ~= 'string' then return end local nsVals = {'main', 'template', 'all'} local tname for i, val in ipairs(nsVals) do if ns == val then tname = ns .. 'Cats' end end if not tname then for i, val in ipairs(nsVals) do nsVals[i] = format('"%s"', val) end error( 'invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or ') ) end self[tname] = self[tname] or {} if type(sort) == 'string' then tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort)) else tinsert(self[tname], format('[[Category:%s]]', cat)) end end function box:addClass(class) if type(class) ~= 'string' then return end self.classes = self.classes or {} tinsert(self.classes, class) end function box:addAttr(attr, val) if type(attr) ~= 'string' or type(val) ~= 'string' then return end self.attrs = self.attrs or {} tinsert(self.attrs, attr) end function box:setTitle(args) -- Get the title object and the namespace. self.pageTitle = getTitleObject(args.page ~= '' and args.page) self.title = self.pageTitle or mw.title.getCurrentTitle() self.demospace = args.demospace ~= '' and args.demospace or nil self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace end function box:getConfig(boxType) -- Get the box config data from the data page. if boxType == 'mbox' then boxType = box.getMboxType(self.nsid) end local cfg = cfgTables[boxType] if not cfg then local boxTypes = {} for k, v in pairs(dataTables) do tinsert(boxTypes, format('"%s"', k)) end tinsert(boxTypes, '"mbox"') error(format( 'invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes) ), 2) end return cfg end function box:removeBlankArgs(cfg, args) -- Only allow blank arguments for the parameter names listed in -- cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param] end return newArgs end function box:setBoxParameters(cfg, args) -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. if cfg.substCheck and args.subst == 'SUBST' then self.isSubstituted = true end -- Find whether we are using a small message box. if cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) then self.isSmall = true else self.isSmall = false end -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} tinsert(issues, sect) tinsert(issues, issue) tinsert(issues, text) self.issue = tconcat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- Add mainspace categories. At the moment these are only used in {{ambox}}. if cfg.allowMainspaceCategories then if args.cat then args.cat1 = args.cat end self.catNums = getArgNums(args, 'cat') if args.category then args.category1 = args.category end self.categoryNums = getArgNums(args, 'category') if args.all then args.all1 = args.all end self.allNums = getArgNums(args, 'all') self.categoryParamNums = union(self.catNums, self.categoryNums) self.categoryParamNums = union(self.categoryParamNums, self.allNums) -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(self.categoryParamNums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = format('%s %s %s', mainCat, preposition, date) self:addCat('main', catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat( 'main', 'Articles with invalid date parameter in template' ) end elseif mainCat and (not date or date == '') then self:addCat('main', mainCat) end if allCat then self:addCat('main', allCat) end end end -- Add template-namespace categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat('template', cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat('template', cfg.templateCategory) end end -- Add template error category. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat('template', templateCat, templateSort) end -- Categories for all namespaces. if self.invalidTypeError then local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. self.categories = categoryHandler{ main = tconcat(self.mainCats or {}), template = tconcat(self.templateCats or {}), all = tconcat(self.allCats or {}), nocat = args.nocat, demospace = self.demospace, page = self.pageTitle and self.pageTitle.prefixedText or nil } end function box:export() local root = htmlBuilder.create() -- Add the subst check error. if self.isSubstituted and self.name then root .tag('b') .addClass('error') .wikitext(format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root.tag('table') boxTable .attr('id', self.id) for i, class in ipairs(self.classes or {}) do boxTable .addClass(class) end boxTable .cssText(self.style) .attr('role', 'presentation') for attr, val in pairs(self.attrs or {}) do boxTable .attr(attr, val) end -- Add the left-hand image. local row = boxTable.tag('tr') if self.imageLeft then local imageLeftCell = row.tag('td').addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell.tag('div').css('width', '52px') end imageLeftCell .wikitext(self.imageLeft) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row.tag('td') .addClass('mbox-empty-cell') .cssText(self.imageEmptyCellStyle) end -- Add the text. local textCell = row.tag('td').addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell .cssText(self.textstyle) local textCellSpan = textCell.tag('span') textCellSpan .addClass('mbox-text-span') .wikitext(self.issue) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.talk and ' ' .. self.talk) .wikitext(self.fix and ' ' .. self.fix) end textCellSpan .wikitext(self.date and ' ' .. self.date) if not self.isSmall then textCellSpan .tag('span') .addClass('hide-when-compact') .wikitext(self.info and ' ' .. self.info) end else -- Default text formatting - anything goes. textCell .cssText(self.textstyle) .wikitext(self.text) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row.tag('td').addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell.tag('div').css('width', '52px') end imageRightCell .wikitext(self.imageRight) end -- Add the below row. if self.below then boxTable.tag('tr') .tag('td') .attr('colspan', self.imageRight and '3' or '2') .addClass('mbox-text') .cssText(self.textstyle) .wikitext(self.below) end -- Add error message for invalid type parameters. if self.invalidTypeError then root .tag('div') .css('text-align', 'center') .wikitext(format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root .wikitext(self.categories) return tostring(root) end local function main(boxType, args) local outputBox = box.new() outputBox:setTitle(args) local cfg = outputBox:getConfig(boxType) args = outputBox:removeBlankArgs(cfg, args) outputBox:setBoxParameters(cfg, args) return outputBox:export() end local function makeWrapper(boxType) return function (frame) local args = getArgs(frame, {trim = false, removeBlanks = false}) return main(boxType, args) end end local p = { main = main, mbox = makeWrapper('mbox') } for boxType in pairs(cfgTables) do p[boxType] = makeWrapper(boxType) end return p d9cf4985a3c3483d55d9ad55527c486546aeb422 Module:Infobox 828 10 322 321 2014-04-14T04:46:24Z wikipedia>Mr. Stradivarius 0 add a "headerclass" arg per talk page request Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .addClass(rowArgs.rowclass) .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .addClass(args.headerclass) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 1c73d36611099447b9f7df8d4630c585ecbc3958 323 322 2014-04-21T07:04:30Z wikipedia>Mr. Stradivarius 0 make union a local function per protected edit request by [[User:Jackmcbarn]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .addClass(rowArgs.rowclass) .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .addClass(args.headerclass) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('br', {selfClosing = true}) .done() .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 50b6b141d2fd3966fc509c941eff5efd0b78d2e5 324 323 2014-05-03T13:24:52Z wikipedia>Plastikspork 0 Remove br between image and caption as requested on the talk page (please revert if this causes a problem!) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .addClass(rowArgs.rowclass) .tag('th') .attr('colspan', 2) .addClass(rowArgs.class) .addClass(args.headerclass) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) if rowArgs.label then row .tag('th') .attr('scope', 'row') .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 01525cf88ac644fa619276b4b1d6ef518450a245 325 324 2014-06-18T23:27:08Z wikipedia>Mr. Stradivarius 0 allow setting ids for rows, headers, labels and data fields, per protected edit request by [[User:Czarkoff]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root .tag('tr') .addClass(rowArgs.rowclass) .attr('id', rowArgs.rowid) .tag('th') .attr('colspan', 2) .attr('id', rowArgs.headerid) .addClass(rowArgs.class) .addClass(args.headerclass) .css('text-align', 'center') .cssText(args.headerstyle) .wikitext(rowArgs.header) elseif rowArgs.data then local row = root.tag('tr') row.addClass(rowArgs.rowclass) row.attr('id', rowArgs.rowid) if rowArgs.label then row .tag('th') .attr('scope', 'row') .attr('id', rowArgs.labelid) .css('text-align', 'left') .cssText(args.labelstyle) .wikitext(rowArgs.label) .done() end local dataCell = row.tag('td') if not rowArgs.label then dataCell .attr('colspan', 2) .css('text-align', 'center') end dataCell .attr('id', rowArgs.dataid) .addClass(rowArgs.class) .cssText(rowArgs.datastyle) .newline() .wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root .tag('caption') .addClass(args.titleclass) .cssText(args.titlestyle) .wikitext(args.title) end local function renderAboveRow() if not args.above then return end root .tag('tr') .tag('th') .attr('colspan', 2) .addClass(args.aboveclass) .css('text-align', 'center') .css('font-size', '125%') .css('font-weight', 'bold') .cssText(args.abovestyle) .wikitext(args.above) end local function renderBelowRow() if not args.below then return end root .tag('tr') .tag('td') .attr('colspan', '2') .addClass(args.belowclass) .css('text-align', 'center') .cssText(args.belowstyle) .newline() .wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)]) if caption then data .tag('div') .cssText(args.captionstyle) .wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root .tag('tr') .tag('td') .attr('colspan', '2') .css('text-align', 'right') .wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = HtmlBuilder.create('table') root .addClass('infobox') .addClass(args.bodyclass) .attr('cellspacing', 3) .css('border-spacing', '3px') if args.subbox == 'yes' then root .css('padding', '0') .css('border', 'none') .css('margin', '-3px') .css('width', 'auto') .css('min-width', '100%') .css('font-size', '100%') .css('clear', 'none') .css('float', 'none') .css('background-color', 'transparent') else root .css('width', '22em') end root .cssText(args.bodystyle) renderTitle() renderAboveRow() else root = HtmlBuilder.create() root .wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p c0fc0edbeaa65d375289552a3c91588f8c14c143 Module:Arguments 828 2 16 15 2014-04-15T08:10:43Z wikipedia>Mr. Stradivarius 0 fix undefined next() behaviour bug by checking for metatable.donePairs in the __index metamethod; also, format the module so it fits into 80 characters Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} local nilArg = {} -- Used for memoizing nil arguments in metaArgs. -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the arguments from the frame object if available. If the frame object -- is not available, we are being called from another Lua module or from the -- debug console, so assign the args to a new variable so we can -- differentiate them. --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set up the args and metaArgs tables. args will be the one accessed from -- functions, and metaArgs will hold the actual arguments. The metatable -- connects the two together. local args, metaArgs, metatable = {}, {}, {} setmetatable(args, metatable) --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end local function mergeArgs(iterator, tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table using the specified iterator. If a value is already -- present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, but those values can be -- overwritten. --]] for _, t in ipairs(tables) do for key, val in iterator(t) do local metaArgsVal = metaArgs[key] if metaArgsVal == nil or metaArgsVal == nilArg then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then metaArgs[key] = nilArg else metaArgs[key] = tidiedVal end end end end end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Nil arguments are -- also memoized using the nilArg variable in order to increase performance. -- Also, we keep a record in the metatable of when pairs and ipairs have -- been called, so we do not run pairs and ipairs on fargs and pargs more -- than once. We also do not run ipairs on fargs and pargs if pairs has -- already been run, as all the arguments will already have been copied -- over. --]] metatable.__index = function (t, key) local val = metaArgs[key] if metatable.donePairs or val ~= nil then --[[ -- We have either memoized the argument already, or pairs has been -- called, meaning that mergeArgs has already copied all of the -- available arguments into the metaArgs table. We need to check for -- pairs as we can't memoize nils to the metaArgs table while pairs -- is iterating. Adding new instances of nilArg to the metaArgs -- table while pairs is iterating over it produces undefined -- behaviour in the next() function. --]] if val == nilArg then return nil else return val end end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then metaArgs[key] = nilArg else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then metaArgs[key] = nilArg -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return function (t, k) local nk, val = next(metaArgs, k) if val == nilArg then val = nil end return nk, val end end metatable.__ipairs = function () if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return function (t, i) local val = metaArgs[i + 1] if val == nil then return nil elseif val == nilArg then val = nil end return i + 1, val end, nil, 0 end return args end return arguments f5a494d0d7e9133a8e83c97666c6c134bac20e4f 17 16 2014-04-18T10:30:10Z wikipedia>Mr. Stradivarius 0 memoize nils using a separate nilArgs table; this fixes a bug where nil values were being iterated over with pairs() Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the arguments from the frame object if available. If the frame object -- is not available, we are being called from another Lua module or from the -- debug console, so assign the args to a new variable so we can -- differentiate them. --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if not options.parentOnly then fargs = frame.args end if not options.frameOnly then pargs = frame:getParent().args end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(iterator, tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table using the specified iterator. If a value is already -- present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, but those values can be -- overwritten. --]] for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = true else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then nilArgs[key] = true else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = true -- Memoize nils. else metaArgs[key] = val end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () -- Called when ipairs is run on the args table. if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 227296ffcfc989f463176fcc31d5359d3deffbeb 18 17 2014-06-06T14:24:47Z wikipedia>Mr. Stradivarius 0 add a "wrappers" option and fix bug when frame:getParent() returns nil, per protected edit request by [[User:Jackmcbarn]] Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if v == title then found = true break end end elseif options.wrappers == title then found = true end if found then pargs = parent.args else fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end if options.parentFirst then fargs, pargs = pargs, fargs end end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(iterator, tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table using the specified iterator. If a value is already -- present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, but those values can be -- overwritten. --]] for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = true else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then nilArgs[key] = true else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = true else metaArgs[key] = val end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () -- Called when ipairs is run on the args table. if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 19e53b72a0e3df6cc6a57f40f33c1089ac16a8ec 19 18 2014-07-05T03:52:56Z wikipedia>Mr. Stradivarius 0 allow using both the frame and parent frame arguments with the wrappers option if specifically requested, per protected edit request by [[User:Jackmcbarn]] Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if v == title then found = true break end end elseif options.wrappers == title then found = true end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(iterator, tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table using the specified iterator. If a value is already -- present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, but those values can be -- overwritten. --]] for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = true else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal == nil then nilArgs[key] = true else metaArgs[key] = argTableVal return argTableVal end end return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = true else metaArgs[key] = val end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () -- Called when ipairs is run on the args table. if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments be9117822108e372cf55e2b77cba9625a4ccb610 Module:Yesno 828 3 49 48 2014-04-18T10:35:42Z wikipedia>Mr. Stradivarius 0 use the Lua string.lower function instead of mw.ustring.lower; this makes the function around 25x faster Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then return false else return default end end 7f7dd37b2c22342092892b25583859c9c2b24618 Module:Navbar 828 8 248 247 2014-05-07T03:39:52Z wikipedia>Plastikspork 0 Per edit request Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle( pageName ) pageName = trim( pageName ); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); else page_title = mw.title.new( pageName, 'Template' ); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end local function _navbar( args ) if not args[1] then return htmlError('No name provided') end local good, title, talk_title; good, title, talk_title = pcall( getTitle, args[1] ); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. local args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d9ed5f9aab8bebe609bd4f062bdb50e932620fa5 249 248 2014-05-23T20:04:37Z wikipedia>Ymblanter 0 Changed protection level of Module:Navbar: RFPP request ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match( s, "^%s*(.-)%s*$" ) end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle( pageName ) pageName = trim( pageName ); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); else page_title = mw.title.new( pageName, 'Template' ); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end local function _navbar( args ) if not args[1] then return htmlError('No name provided') end local good, title, talk_title; good, title, talk_title = pcall( getTitle, args[1] ); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl( 'action=edit' ); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create( 'div' ) div .addClass( 'plainlinks' ) .addClass( 'hlist' ) .addClass( 'navbar') .cssText( args.style ) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag( 'span' ) .css( 'word-spacing', 0 ) .cssText( args.fontstyle ) .wikitext( args.text or 'This box:' ) .wikitext( ' ' ) end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText( args.fontstyle ) .wikitext( '&#91;' ) .newline(); end local ul = div.tag('ul'); ul .tag( 'li' ) .addClass( 'nv-view' ) .wikitext( '[[' .. mainpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'View this template' ) .cssText( args.fontstyle or '' ) .wikitext( viewLink ) .done() .wikitext( ']]' ) .done() .tag( 'li' ) .addClass( 'nv-talk' ) .wikitext( '[[' .. talkpage .. '|' ) .tag( 'span ' ) .attr( 'title', 'Discuss this template' ) .cssText( args.fontstyle or '' ) .wikitext( talkLink ) .done() .wikitext( ']]' ); if not args.noedit then ul .tag( 'li' ) .addClass( 'nv-edit' ) .wikitext( '[' .. editurl .. ' ' ) .tag( 'span ' ) .attr( 'title', 'Edit this template' ) .cssText( args.fontstyle or '' ) .wikitext( editLink ) .done() .wikitext( ']' ); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '' ) .wikitext( '&#93;' ) .newline(); end return tostring(div) end function p.navbar(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider -- them false too. local args = {} for k, v in pairs(origArgs) do if v ~= '' then args[k] = v end end return _navbar(args) end return p d9ed5f9aab8bebe609bd4f062bdb50e932620fa5 250 249 2014-05-23T21:09:40Z wikipedia>Jackmcbarn 0 autofill name, export _navbar, use Module:Arguments, and fix whitespace, from sandbox Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local good, title, talk_title; good, title, talk_title = pcall(getTitle, args[1] or (':' .. mw.getCurrentFrame():getParent():getTitle())); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul'); ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end return tostring(div) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 77c56bb7bebaeae44f3177d09e7f77a4baab4ddd 251 250 2014-05-24T16:19:17Z wikipedia>Jackmcbarn 0 support collapsible version Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local good, title, talk_title; local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create().tag('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul'); ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end if args.collapsible then div .done() .tag('span') .css('font-size', '110%') .cssText(args.fontstyle or '') .wikitext(args[1]) end return tostring(div.allDone()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p a47c869e8682b330c576a14c3abe9f6516d130fe Module:TableTools 828 7 227 226 2014-05-25T14:11:02Z wikipedia>Mr. Stradivarius 0 fix cleanPattern function - some of the character classes were still being magic even when they were inside the set, so escape them all Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end return p ab9df0eb210b08945b9eed86435858f6e931a79a Module:Category handler/blacklist 828 23 813 2014-07-06T23:44:59Z wikipedia>Mr. Stradivarius 0 move blacklist from [[Module:Category handler]] Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. '^Wikipedia:Cascade%-protected items$', '^Wikipedia:Cascade%-protected items/.*$', '^User:UBX$', -- The userbox "template" space. '^User:UBX/.*$', '^User talk:UBX$', '^User talk:UBX/.*$', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.+$', '/[aA]rchive' -- Don't categorise archives. } 4d208c4df1e8966acff25005d4c06cdc1ce2d564 814 813 2014-07-08T11:08:50Z wikipedia>Mr. Stradivarius 0 make the pattern more efficient Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } c84948ad9808d5d323408d5d10d5652f748a0550 815 814 2014-07-13T09:07:09Z wikipedia>Mr. Stradivarius 0 Protected Module:Category handler/blacklist: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', '/[aA]rchive' -- Don't categorise archives. } c84948ad9808d5d323408d5d10d5652f748a0550 Module:Category handler/shared 828 21 785 2014-07-06T23:46:51Z wikipedia>Mr. Stradivarius 0 move blacklist-matching function from [[Module:Category handler]] Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local blacklist = require('Module:Category handler/blacklist') local function matchesBlacklist(page) if type(page) ~= 'string' then return end for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end return { matchesBlacklist = matchesBlacklist } fef47919df29d34e2f9bb5b6905f85b27768cfbd 786 785 2014-07-07T01:51:59Z wikipedia>Mr. Stradivarius 0 allow specifying a custom blacklist Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local function matchesBlacklist(page, blacklist) if type(page) ~= 'string' then return nil end for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return match end end end return { matchesBlacklist = matchesBlacklist } 8dd5ba93e21647245c65c399e6cac341567776a0 787 786 2014-07-07T13:13:39Z wikipedia>Mr. Stradivarius 0 make this output either true or false, and switch indentation to tabs Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local function matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end return { matchesBlacklist = matchesBlacklist } 51e17c068f08840413571d9d16e6226524ad832d 788 787 2014-07-07T14:55:25Z wikipedia>Mr. Stradivarius 0 add a getNamespaceParameters function Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey = mw.site.namespaces[titleObj.namespace].name mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p 7d7bfab021cb31eb62447eaf34b111ec6e41f7c1 789 788 2014-07-07T15:45:47Z wikipedia>Mr. Stradivarius 0 return a copy of the params table so that it doesn't contain a metatable Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey = mw.site.namespaces[titleObj.namespace].name mappingsKey = mw.ustring.lower(mappingsKey) local origParams = mappings[mappingsKey] or {} local params = {} for i, v in ipairs(origParams) do params[i] = v end return params end return p 36a53e5881da5b036246294822ffe289ad5aedd5 790 789 2014-07-08T00:26:15Z wikipedia>Mr. Stradivarius 0 return the right key in talk space, and don't copy the table; instead, create a new wrapper function that can load the mappings with either require or mw.loadData Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 791 790 2014-07-13T09:06:15Z wikipedia>Mr. Stradivarius 0 Protected Module:Category handler/shared: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 Module:Category handler/data 828 20 776 2014-07-07T02:03:36Z wikipedia>Mr. Stradivarius 0 create data page to be loaded from [[Module:Category handler]] with mw.loadData Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local matchesBlacklist = require('Module:Category handler/shared').matchesBlacklist data.currentTitleMatchesBlacklist = matchesBlacklist( mw.title.getCurrentTitle().prefixedText, require('Module:Category handler/blacklist') ) or false return data c05af9bcc41ab94cb7c367c17a412e9e0571f531 777 776 2014-07-07T13:11:45Z wikipedia>Mr. Stradivarius 0 don't bother with the "or false" Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local matchesBlacklist = require('Module:Category handler/shared').matchesBlacklist data.currentTitleMatchesBlacklist = matchesBlacklist( mw.title.getCurrentTitle().prefixedText, require('Module:Category handler/blacklist') ) return data 734ff8ec8fe61bbe2f499bbabba10a4a55622856 778 777 2014-07-07T15:03:12Z wikipedia>Mr. Stradivarius 0 add a currentTitleNamespaceParameters field Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local mNamespaceDetect = require('Module:Namespace detect') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mNamespaceDetect.getParamMappings() ) return data 3bfa64e2c833246d031767af88c2524d27142e4b 779 778 2014-07-08T00:27:50Z wikipedia>Mr. Stradivarius 0 use the new shared function for getting parameter mappings Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 780 779 2014-07-13T09:05:55Z wikipedia>Mr. Stradivarius 0 Protected Module:Category handler/data: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 Module:Category handler 828 19 769 768 2014-07-13T09:12:24Z wikipedia>Mr. Stradivarius 0 Rewrite this using [[Module:Middleclass]]. It is now more efficient: it only parses parameters when necessary, and caches data with mw.loadData where it can. Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local class = require('Module:Middleclass').class local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = class('CategoryHandler') function CategoryHandler:initialize(data, args) self._data = data self._args = args -- Set the title object do local pagename = self:parameter('demopage') local success, titleObj = pcall(mw.title.new, pagename) if success and titleObj then self.title = titleObj else self.title = mw.title.getCurrentTitle() self._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = self:parameter(key) value = trimWhitespace(value, true) self['_' .. key] = yesno(value) end do local subpage = self:parameter('subpage') local category2 = self:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end self._subpage = trimWhitespace(subpage, true) self._category2 = trimWhitespace(category2) -- don't remove blank values end end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler:new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p 03eff5239d10a569495a212096b443c68b50e073 770 769 2014-07-13T17:57:16Z wikipedia>WOSlinker 0 apply changes from sandbox as requested by [[User:Jackmcbarn]] which removes middleclass dependency Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj = pcall(mw.title.new, pagename) if success and titleObj then obj.title = titleObj else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p 1db005501ef03e225a9a628f1b9e9b6092475807 Module:Category handler 828 19 771 770 2014-07-22T05:08:26Z wikipedia>Mr. Stradivarius 0 allow invocations specifying the page parameter to use the mw.loadData optimisations, and don't call mw.title.new every time Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f Module:Italic title 828 6 175 174 2014-08-21T06:55:48Z wikipedia>Paine Ellsworth 0 per edit request on talk page Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) -- Process the arguments. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args for k, v in pairs(frame.args) do args = frame.args break end else args = frame end local title = mw.title.getCurrentTitle() -- Get the current page object. -- Find the parts before and after the disambiguation parentheses, if any. local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If parentheses were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and parentheses and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. parentheses else result = "''" .. title.text .. "''" end -- Add the namespace if it exists. if title.nsText and title.nsText ~= "" then result = title.nsText:gsub('_', ' ') .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result ) end return p 9010a599a21adc319ce3499d1ad50ab58a06e61e 176 175 2014-08-21T07:56:18Z wikipedia>Mr. Stradivarius 0 use mw.site.namespaces to get the namespace name without underscores; also use [[Module:Arguments]] and convert whitespace to tabs Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Italic title' }) local title = mw.title.getCurrentTitle() -- Find the parts before and after the disambiguation parentheses, if any. local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If parentheses were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and parentheses and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. parentheses else result = "''" .. title.text .. "''" end -- Add the namespace if we're not in mainspace. if title.namespace ~= 0 then result = mw.site.namespaces[title.namespace].name .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', result) end return p ab2281a5b592d1e7457922b74a7c58d634ccbf61 177 176 2014-08-21T08:20:52Z wikipedia>Mr. Stradivarius 0 allow the ability to specify the "noerror" parameter Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Italic title' }) local title = mw.title.getCurrentTitle() -- Find the parts before and after the disambiguation parentheses, if any. local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') -- If parentheses were found, italicise only the part before them. Otherwise -- italicise the whole title. local result if prefix and parentheses and args.all ~= 'yes' then result = "''" .. prefix .. "'' " .. parentheses else result = "''" .. title.text .. "''" end -- Add the namespace if we're not in mainspace. if title.namespace ~= 0 then result = mw.site.namespaces[title.namespace].name .. ':' .. result end -- Call displaytitle with the text we generated. return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result, args[1] ) end return p 07e5bc13278554f35dedfa07c4358141c64cbac3 178 177 2015-03-03T23:37:06Z wikipedia>Mr. Stradivarius 0 allow this to be called from Lua, and make it more compact Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p._main(args, frame, title) args = args or {} frame = frame or mw.getCurrentFrame() title = title or mw.title.getCurrentTitle() local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') local result if prefix and parentheses and args.all ~= 'yes' then result = string.format("''%s'' %s", prefix, parentheses) else result = string.format("''%s''", title.text) end if title.namespace ~= 0 then result = title.nsText .. ':' .. result end return frame:callParserFunction('DISPLAYTITLE', result, args[1]) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Italic title' }) return p._main(args, frame) end return p b2173b79d62be3fd2df23372c31804897c6e8dc5 179 178 2015-07-30T17:57:51Z wikipedia>Izkala 0 Use <i> to italicise apostrophes, per ER Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p._main(args, frame, title) args = args or {} frame = frame or mw.getCurrentFrame() title = title or mw.title.getCurrentTitle() local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') local result if prefix and parentheses and args.all ~= 'yes' then result = string.format("<i>%s</i> %s", prefix, parentheses) else result = string.format("<i>%s</i>", title.text) end if title.namespace ~= 0 then result = title.nsText .. ':' .. result end return frame:callParserFunction('DISPLAYTITLE', result, args[1]) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Italic title' }) return p._main(args, frame) end return p a52b3ab72ffa81097924d7f3fd3906f6d32b3a20 180 179 2016-04-19T23:06:14Z wikipedia>Mr. Stradivarius 0 replace underscores with spaces in namespace names Scribunto text/plain -- This module implements {{italic title}}. local p = {} function p._main(args, frame, title) args = args or {} frame = frame or mw.getCurrentFrame() title = title or mw.title.getCurrentTitle() local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$') local result if prefix and parentheses and args.all ~= 'yes' then result = string.format("<i>%s</i> %s", prefix, parentheses) else result = string.format("<i>%s</i>", title.text) end if title.namespace ~= 0 then result = title.nsText:gsub('_', ' ') .. ':' .. result end return frame:callParserFunction('DISPLAYTITLE', result, args[1]) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Italic title' }) return p._main(args, frame) end return p 89ba0598b9d3711f13a95843c9fdf9a59347a4f7 181 180 2016-07-12T23:57:51Z wikipedia>Mr. Stradivarius 0 replace with an object-based framework, and add a dabonly function for [[Template:Italic dab]] Scribunto text/plain -- This module implements {{italic title}}. require('Module:No globals') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) %(([^%(%)]+)%)$' ) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then titleParts.title = self.title for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = titleParts.title:gsub( pattern, italicize ) titleParts.title = italicizedTitle -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) return ItalicTitle.new() :italicize('dab') :render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p 8c5cb60620fbf423b53f2a170efe7b2380a31c08 Module:Navbar 828 8 252 251 2014-10-09T22:35:46Z wikipedia>Jackmcbarn 0 inherit line height on the ul to override the 1.6 default, so that it doesn't take up 2 lines and cause off-centeredness in navboxes like [[Template:Grand Armee Corps]] Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local good, title, talk_title; local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create().tag('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul') .css('line-height', 'inherit'); -- otherwise, the default ul line height makes this take up 2 lines in navboxes, and makes the second line off-center ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end if args.collapsible then div .done() .tag('span') .css('font-size', '110%') .cssText(args.fontstyle or '') .wikitext(args[1]) end return tostring(div.allDone()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 9ad83c9253230f3c4d3e4c5c5b91786d4e01eaa6 253 252 2014-10-10T07:31:12Z wikipedia>Edokter 0 No longer needed; moved fix to Common.css. Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function htmlError(s) local span = HtmlBuilder.create('span') span .addClass('error') .css('float', 'left') .css('white-space', 'nowrap') .wikitext('Error: ' .. s) return tostring(span) end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local good, title, talk_title; local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())); if not good then return htmlError(title); end if not title then return htmlError('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create().tag('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul'); ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end if args.collapsible then div .done() .tag('span') .css('font-size', '110%') .cssText(args.fontstyle or '') .wikitext(args[1]) end return tostring(div.allDone()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p a47c869e8682b330c576a14c3abe9f6516d130fe 254 253 2014-11-24T21:07:38Z wikipedia>Jackmcbarn 0 remove obnoxious pcall-and-rethrow behavior, now that real script errors include details Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local title, talk_title; local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end title, talk_title = getTitle(args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())); if not title then error('Page does not exist') end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create().tag('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul'); ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end if args.collapsible then div .done() .tag('span') .css('font-size', '110%') .cssText(args.fontstyle or '') .wikitext(args[1]) end return tostring(div.allDone()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p fe06f082fce12c2aadc245ae78a7386f6d1dd5de 255 254 2014-11-27T22:46:08Z wikipedia>Jackmcbarn 0 less misleading error message Scribunto text/plain local p = {} local getArgs local HtmlBuilder = require('Module:HtmlBuilder') local function trim(s) return mw.ustring.match(s, "^%s*(.-)%s*$") end local function getTitle(pageName) pageName = trim(pageName); local page_title, talk_page_title; if mw.ustring.sub(pageName, 1, 1) == ':' then page_title = mw.title.new( mw.ustring.sub(pageName, 2)); else page_title = mw.title.new(pageName, 'Template'); end if page_title then talk_page_title = page_title.talkPageTitle; else talk_page_title = nil; end return page_title, talk_page_title; end function p._navbar(args) local title, talk_title; local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) title, talk_title = getTitle(titleText); if not title then error('Invalid title ' .. titleText) end local mainpage = title.fullText; local talkpage = talk_title and talk_title.fullText or '' local editurl = title:fullUrl('action=edit'); local viewLink, talkLink, editLink = 'view', 'talk', 'edit' if args.mini then viewLink, talkLink, editLink = 'v', 't', 'e' end local div = HtmlBuilder.create().tag('div') div .addClass('plainlinks') .addClass('hlist') .addClass('navbar') .cssText(args.style) if args.mini then div.addClass('mini') end if not (args.mini or args.plain) then div .tag('span') .css('word-spacing', 0) .cssText(args.fontstyle) .wikitext(args.text or 'This box:') .wikitext(' ') end if args.brackets then div .tag('span') .css('margin-right', '-0.125em') .cssText(args.fontstyle) .wikitext('&#91;') .newline(); end local ul = div.tag('ul'); ul .tag('li') .addClass('nv-view') .wikitext('[[' .. mainpage .. '|') .tag('span') .attr('title', 'View this template') .cssText(args.fontstyle or '') .wikitext(viewLink) .done() .wikitext(']]') .done() .tag('li') .addClass('nv-talk') .wikitext('[[' .. talkpage .. '|') .tag('span') .attr('title', 'Discuss this template') .cssText(args.fontstyle or '') .wikitext(talkLink) .done() .wikitext(']]'); if not args.noedit then ul .tag('li') .addClass('nv-edit') .wikitext('[' .. editurl .. ' ') .tag('span') .attr('title', 'Edit this template') .cssText(args.fontstyle or '') .wikitext(editLink) .done() .wikitext(']'); end if args.brackets then div .tag('span') .css('margin-left', '-0.125em') .cssText( args.fontstyle or '') .wikitext('&#93;') .newline(); end if args.collapsible then div .done() .tag('span') .css('font-size', '110%') .cssText(args.fontstyle or '') .wikitext(args[1]) end return tostring(div.allDone()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p a8e29caeae100a424fe866924c86ff5b716a9519 256 255 2014-11-30T21:04:48Z wikipedia>Jackmcbarn 0 switch to mw.html and other cleanup from sandbox Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag('span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag('span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag('span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 355c0c0140feac84afef2bb9ab9e2ce3b5d8fa0e 257 256 2014-11-30T21:51:43Z wikipedia>George Orwell III 0 rem unneeded tabs/spacing for more unified importing/exporting Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag('span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag('span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag('span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p d71ad8a6b282b27feee5c6bfba3f40c608f04687 258 257 2015-10-20T12:19:23Z wikipedia>MSGJ 0 changes requested by [[User:Matt Fitzpatrick]] to improve accessibility Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e 259 258 2015-12-22T16:44:07Z wikipedia>Xaosflux 0 Changed protection level of Module:Navbar: used in the mediawiki interface ex: [[MediaWiki:Watchlist-details]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e Module:Infobox 828 10 326 325 2014-10-30T09:49:12Z wikipedia>Mr. Stradivarius 0 update to use mw.html instead of [[Module:HtmlBuilder]] - conversion courtesy of [[User:WOSlinker]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) :attr('cellspacing', 3) :css('border-spacing', '3px') if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 0a1b1912ddafe55133e9fcb2ff55c6ac826557bd 327 326 2014-10-30T21:57:58Z wikipedia>Mr. Stradivarius 0 add rowstyle and remove the cellspacing attribute, per protected edit requests by [[User:Frietjes]] and [[User:Rezonansowy]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) :css('border-spacing', '3px') if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 86e1478fd8743c450357bc986ba1e1f3e11b45a3 328 327 2014-11-01T01:33:05Z wikipedia>Mr. Stradivarius 0 add a missing rowstyle per protected edit request by [[User:Frietjes]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) :css('border-spacing', '3px') if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p fb37586ba6298c5632e4411ee6573c0800896d2c 329 328 2014-11-14T20:36:59Z wikipedia>Edokter 0 Moved border-spacing to Common.css Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 40e5d9e3ac774e49629af4f6cfc5b97c5b9997e9 330 329 2015-02-12T00:07:12Z wikipedia>Mr. Stradivarius 0 change [[:Category:Articles which use embedded infobox templates with the title parameter]] to [[:Category:Pages which use embedded infobox templates with the title parameter]] per protected edit request by [[User:Frietjes]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(mw.getCurrentFrame():expandTemplate({ title = 'navbar', args = { args.name, mini = 1 } })) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p e2b454237c72f42e69b8d31d8a9f252351606c2a 331 330 2015-04-15T13:28:06Z wikipedia>WOSlinker 0 call navbar via module rather than template Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 90aa1ebe40b3d3466235fa2f7c6e12d5db375fd7 332 331 2015-05-25T17:32:56Z wikipedia>Jackmcbarn 0 from sandbox, remove now-unnecessary argument parsing complexity, and some other fixes Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(args, prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(root, args, rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle(root, args) if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow(root, args) if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow(root, args) if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders(root, args) if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums(args, 'subheader') for k, num in ipairs(subheadernums) do addRow(root, args, { data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages(root, args) if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums(args, 'image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow(root, args, { data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows(root, args) -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums(args, 'header'), getArgNums(args, 'data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow(root, args, { header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar(root, args) if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle(root, args) local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories(root, args) if args.decat ~= 'yes' then if #(getArgNums(args, 'data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end function p.infobox(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Infobox', valueFunc = function(k, v) if v ~= '' or k == 'italic title' then return v end end }) -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. local root if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle(root, args) renderAboveRow(root, args) else root = mw.html.create() root :wikitext(args.title) end renderSubheaders(root, args) renderImages(root, args) renderRows(root, args) renderBelowRow(root, args) renderNavBar(root, args) renderItalicTitle(root, args) renderTrackingCategories(root, args) return tostring(root) end return p 0444f2cca65c927384ab50b2940f94e75b248c93 333 332 2015-06-08T15:58:28Z wikipedia>Jackmcbarn 0 Undid revision 663978215 by [[Special:Contributions/Jackmcbarn|Jackmcbarn]] ([[User talk:Jackmcbarn|talk]]): [[gerrit:216688]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :css('text-align', 'left') :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 90aa1ebe40b3d3466235fa2f7c6e12d5db375fd7 334 333 2015-06-23T19:58:16Z wikipedia>MSGJ 0 text-align left now handled by common.css, request by [[User:Alakzi]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 3507df5b4527aecfec0b000e06a05c3fa3264a88 Module:Message box/configuration 828 5 147 146 2014-11-25T21:56:15Z wikipedia>Mr. Stradivarius 0 add the licensetpl class to license imboxes per protected edit request by [[User:Guillaume (WMF)]] - part of [[m:File metadata cleanup drive]] Scribunto text/plain local ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox speedy deletion.png' }, delete = { class = 'ambox-delete', image = 'Ambox deletion.png' }, content = { class = 'ambox-content', image = 'Ambox content.png' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Ambox move.png' }, protection = { class = 'ambox-protection', image = 'Ambox protection.png' }, notice = { class = 'ambox-notice', image = 'Ambox notice.png' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} } local cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Cmbox deletion.png' }, delete = { class = 'cmbox-delete', image = 'Cmbox deletion.png' }, content = { class = 'cmbox-content', image = 'Cmbox content.png' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Cmbox move.png' }, protection = { class = 'cmbox-protection', image = 'Cmbox protection.png' }, notice = { class = 'cmbox-notice', image = 'Cmbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true } local fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Cmbox deletion.png' }, editnotice = { class = 'fmbox-editnotice', image = 'Imbox notice.png' }, system = { class = 'fmbox-system', image = 'Imbox notice.png' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false } local imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'imbox-delete', image = 'Imbox deletion.png' }, content = { class = 'imbox-content', image = 'Imbox content.png' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Imbox move.png' }, protection = { class = 'imbox-protection', image = 'Imbox protection.png' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' }, featured = { class = 'imbox-featured', image = 'Imbox featured.png' }, notice = { class = 'imbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' } local ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'ombox-delete', image = 'Imbox deletion.png' }, content = { class = 'ombox-content', image = 'Imbox content.png' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Imbox move.png' }, protection = { class = 'ombox-protection', image = 'Imbox protection.png' }, notice = { class = 'ombox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true } local tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Imbox speedy deletion.png' }, delete = { class = 'tmbox-delete', image = 'Imbox deletion.png' }, content = { class = 'tmbox-content', image = 'Imbox content.png' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg ' }, move = { class = 'tmbox-move', image = 'Imbox move.png' }, protection = { class = 'tmbox-protection', image = 'Imbox protection.png' }, notice = { class = 'tmbox-notice', image = 'Imbox notice.png' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowId = true, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } return { ambox = ambox, cmbox = cmbox, fmbox = fmbox, imbox = imbox, ombox = ombox, tmbox = tmbox } 6f64f293f56632c5c49f3eda1524dac01c6c1ccc 148 147 2014-11-29T17:58:41Z wikipedia>Jackmcbarn 0 bring in changes from sandbox Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, allowId = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Padlock-silver-medium.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowId = true, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } 5b9915943ff3367bdfce34227b0b94069cdc27e2 149 148 2015-03-18T13:54:54Z wikipedia>Mr. Stradivarius 0 remove allowId Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'} }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Padlock-silver-medium.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } f55511da58d4ffa383eba2fda8c0a2b0fd9df670 150 149 2016-04-26T02:29:36Z wikipedia>Mr. Stradivarius 0 add removalNotice field to ambox Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]].' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Padlock-silver-medium.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } df5ad316bc5fcebef44e5a3e549c290be6a023b6 151 150 2016-04-27T06:33:43Z wikipedia>Mr. Stradivarius 0 tweak removal notice Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'plainlinks', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'plainlinks', 'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Padlock-silver-medium.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, usePlainlinksParam = true, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'plainlinks', 'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } 57310751e3d91a053234f2ce6f45ed7de55fb0f3 152 151 2016-10-03T11:04:13Z wikipedia>Mr. Stradivarius 0 allow all templates to disable the plainlinks class Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Padlock-silver-medium.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Padlock-silver-medium.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } 0a35f7ed72823141fd5c661fd96cfa6d7a3a823a Module:Message box 828 4 108 107 2014-11-29T17:56:21Z wikipedia>Jackmcbarn 0 bring in changes from sandbox Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. if cfg.allowId then self.id = args.id end self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration')) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 47f8e2048340e3f8e3c1728f70a7010422a93bd5 109 108 2015-03-18T13:53:57Z wikipedia>Mr. Stradivarius 0 remove cfg.allowId Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration')) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 0e1b08d466f6c7979b1f95f3ad403fbd4998209c 110 109 2016-04-03T03:20:50Z wikipedia>Xaosflux 0 Changed protection level of Module:Message box: tweak to make this the most recent protection ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration')) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 0e1b08d466f6c7979b1f95f3ad403fbd4998209c 111 110 2016-04-03T03:21:10Z wikipedia>Xaosflux 0 Changed protection level of Module:Message box: high risk module, used on main page and system messages ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration')) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 0e1b08d466f6c7979b1f95f3ad403fbd4998209c 112 111 2016-04-26T02:32:20Z wikipedia>Mr. Stradivarius 0 add a removalnotice parameter to ambox, don't display blank spans, and make the config module page a constant so it's easier to see Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellSpan:tag('div') :addClass('hide-when-compact') :tag('ul') :tag('li') :tag('small') :wikitext(self.removalNotice) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 0d6696bdf1d5505e495a31d4322c3ad339f1a84e 113 112 2016-04-27T06:34:52Z wikipedia>Mr. Stradivarius 0 move the removal notice inline Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks' ) for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellSpan:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) b63e64531eaf482542ffdf7aaa7ad246a5dc376a 114 113 2016-10-03T11:03:28Z wikipedia>Mr. Stradivarius 0 allow all templates to disable the plainlinks class Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellSpan = textCell:tag('span') textCellSpan :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellSpan:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellSpan:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellSpan :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellSpan:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 8fa1c9943ddcaf7bea934dd5ff80c273f27215c8 MediaWiki:Gadget-switcher.js 8 38 1083 2014-12-02T02:00:27Z wikipedia>Jackmcbarn 0 [[WP:AES|←]]Created page with '( function ( $ ) { 'use strict'; $( function () { $( '.switcher-container' ).each( function ( i ) { var activeElement, $showRadio, $showAllRadio; var e...' javascript text/javascript ( function ( $ ) { 'use strict'; $( function () { $( '.switcher-container' ).each( function ( i ) { var activeElement, $showRadio, $showAllRadio; var elements = [], container = this; var radioName = 'switcher-' + i; $( this ).children().each( function () { var self = this; var $labelContainer = $( this ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } elements.push( this ); $showRadio = $( '<input type="radio" />' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( self ).show(); activeElement = self; } ); $( '<label style="display:block"></label>' ).append( $showRadio ).append( $labelText ).appendTo( container ); if ( !activeElement ) { activeElement = this; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.is( '[data-switcher-default]' ) ) { $showRadio.click(); } else { $( this ).hide(); } $labelContainer.remove(); } ); if ( elements.length > 1 ) { $showAllRadio = $( '<input type="radio" />' ).attr( 'name', radioName ).click( function () { $( elements ).show(); activeElement = elements; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } else if ( elements.length === 1 ) { $showRadio.remove(); } } ); } ); } )( jQuery ); cafb7bbb55fe89d664888888685547253a156642 Module:Arguments 828 2 20 19 2014-12-11T04:32:27Z wikipedia>Mr. Stradivarius 0 fix bug where explicitly deleted args were still appearing when iterated over with pairs or ipairs - code courtesy of [[User:Jackmcbarn]] Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if v == title then found = true break end end elseif options.wrappers == title then found = true end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(iterator, tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table using the specified iterator. If a value is already -- present it is not overwritten; tables listed earlier have precedence. -- We are also memoizing nil values, which can be overwritten if they -- are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in iterator(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(pairs, argTables) metatable.donePairs = true metatable.doneIpairs = true end return pairs(metaArgs) end metatable.__ipairs = function () -- Called when ipairs is run on the args table. if not metatable.doneIpairs then mergeArgs(ipairs, argTables) metatable.doneIpairs = true end return ipairs(metaArgs) end return args end return arguments 3f0c4f46f7f2a8fba256cb84dc57b491958584f2 21 20 2015-01-31T22:31:40Z wikipedia>Jackmcbarn 0 apply changes from sandbox - all tests pass Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return pairs(metaArgs) end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments fa7359cfac75b175b987c37deaf472c4d381c27d 22 21 2015-06-26T22:53:15Z wikipedia>Jackmcbarn 0 add argument translation from sandbox - all tests pass Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 23 22 2015-12-23T16:07:27Z wikipedia>Xaosflux 0 Changed protection level of Module:Arguments: used in the mediawiki interface ex: [[MediaWiki:Watchlist-details]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 Module:Yesno 828 3 50 49 2015-04-27T10:43:30Z wikipedia>MSGJ 0 recognise "t" for true and "f" for false, per request Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or tonumber(val) == 0 then return false else return default end end 12981c9a31eb2b0af1be4f16fc0642e180eac8c2 Template:Ambox 10 18 747 746 2016-02-12T23:50:56Z wikipedia>MSGJ 0 add temporary tracking category for small amboxes wikitext text/x-wiki {{#invoke:Message box|ambox}}{{#ifeq:{{{small}}}|left|[[Category:Articles using small message boxes]]}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> a2c8099e3f9edd2e67527dd554f50790a79fff03 748 747 2016-04-17T13:24:11Z w>MarcoAurelio 0 Changed protection level for "[[Template:Ambox]]": High risk template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) wikitext text/x-wiki {{#invoke:Message box|ambox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> bf0ee50293a043290608e9f2a2c54ec194e9cdeb Module:Category handler/blacklist 828 23 816 815 2016-12-30T10:58:25Z wikipedia>Mr. Stradivarius 0 add archives of ANI to the blacklist Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 8340772d6396235df48f57928318aa0f6b42dc70 817 816 2016-12-30T13:43:45Z wikipedia>Mr. Stradivarius 0 don't categorise sandboxes, and convert this to use tabs Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", '/[sS]andbox$', -- Don't categorise sandboxes } 85d93c26fa0bd7adc510afd09ce43818f316d44e 818 817 2016-12-30T14:53:53Z wikipedia>Mr. Stradivarius 0 on second thoughts, blacklisting sandboxes for all templates is probably a bad idea Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 99582c2055a4d265f2760cc524c710b6f5d55d1a Template:Infobox 10 11 586 585 2017-02-15T21:41:48Z wikipedia>Andrew Gray 0 Changed protection level for "[[Template:Infobox]]": Degrade to template permission per request, in line with [[WP:PP]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) wikitext text/x-wiki {{#invoke:Infobox|infobox}}<noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> adcda4ac544f8af340cf47833dc2960631593988 Module:Infobox 828 10 335 334 2017-02-16T04:05:01Z wikipedia>Mr. Stradivarius 0 Changed protection level for "[[Module:Infobox]]": [[WP:High-risk templates|High-risk Lua module]]: allow template editors ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 3507df5b4527aecfec0b000e06a05c3fa3264a88 336 335 2017-04-04T05:39:21Z wikipedia>Frietjes 0 rowcellstyle per talk page Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 7b1cf9075911e93593dde72e315d1146aa487c9c 337 336 2017-05-29T13:38:50Z wikipedia>Jc86035 0 fixes for child infoboxes so HTML Tidy is not required Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local orphancat = 'Category:Orphan infoboxes' local function notempty( s ) return s and s:match( '%S' ) end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local s = {} local ttype = 'td' if rowArgs.header then rowArgs.data = nil s = mw.text.split(rowArgs.header, '%[%[' .. orphancat .. '%]%]') if notempty(s[1]) then rowArgs.header = s[1] else rowArgs.header = nil end ttype = 'th' elseif rowArgs.data then s = mw.text.split(rowArgs.data, '%[%[' .. orphancat .. '%]%]') if notempty(s[1]) then rowArgs.data = s[1] else rowArgs.data = nil end ttype = 'td' end if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local s = mw.text.split(rowArgs.data, '%[%[' .. orphancat .. '%]%]') rowArgs.data = s[1] local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(rowArgs.data) end for i = 2, #s do if notempty(s[i]) then if (i % 2) == 0 then root :wikitext(s[i]) else local dataCell = root:tag('tr'):tag(ttype) dataCell :attr('colspan', 2) :wikitext(s[i]) end end end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. local marker = '' if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() marker = '[[' .. orphancat .. ']]' root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return marker .. tostring(root) .. marker end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p b9f942b85cf1c6edc277bfeb5e4dfa673dd607e4 338 337 2017-05-29T14:12:49Z wikipedia>Frietjes 0 Undid revision 782833995 by [[Special:Contributions/Jc86035|Jc86035]] ([[User talk:Jc86035|talk]]) looks like this caused some serious problems, will require more testing (see, e.g, my talk page) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 7b1cf9075911e93593dde72e315d1146aa487c9c 339 338 2017-06-05T13:55:32Z wikipedia>Jc86035 0 merge from sandbox; still some pages with odd infoboxes over the place because of Tidy Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 1b331eafc60070b3e3f406bd94741437c9c63f16 340 339 2017-06-07T12:14:38Z wikipedia>Jc86035 0 Undid revision 783927044 by [[Special:Contributions/Jc86035|Jc86035]] ([[User talk:Jc86035|talk]]) Doesn't play well with succession boxes Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.header) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 7b1cf9075911e93593dde72e315d1146aa487c9c 341 340 2017-06-17T07:53:56Z wikipedia>Jc86035 0 try implementing again? Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass('infobox') :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 9351c3d960cc04a28ebffb081575f5ac9990ad19 342 341 2018-01-24T22:39:59Z wikipedia>Frietjes 0 infobox class not needed for subbox since the parent box will set the class (and causes problems on mobile) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 3c0184beda9afaf0fe936d06101680d646f31874 343 342 2018-07-06T13:05:33Z wikipedia>Frietjes 0 add per https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 see "two plain list" testcase Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of * lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 s = mw.ustring.gsub(s, '([\r\n]%*[^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^(%*[^\r\n]*)$', '%1\n') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 00c0a1dd8a3ad7d25793aef77001d71331e07376 344 343 2018-07-07T07:04:41Z wikipedia>Jc86035 0 the three other types of lists as well Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end if args.child == 'yes' and args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 1eda9695376daa6413df85b21fedcdfb294ee507 345 344 2018-08-26T15:49:54Z wikipedia>Primefac 0 avoid "no data" tracking category when "child=yes" (see [[Template_talk:Infobox#Decat_by_default_when_child=yes?]]) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p ed1b215bd145f3bc5d9925098ba080721af9f240 346 345 2018-10-22T23:10:29Z wikipedia>Frietjes 0 per talk page Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :newline() :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :newline() :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 08e72e5df7c12d726a9bd6f3b6bc1151642fc73c 347 346 2018-11-05T22:47:50Z wikipedia>Frietjes 0 fix for spurious <p> tag per talk page Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 86cf80d64495ad16eb12aa533ca749c55689b02d Module:Navbar 828 8 260 259 2017-03-21T11:27:08Z wikipedia>Primefac 0 updating from sandbox per TPER Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p f18e4f51695a2e9b7cd7c05a0b10f1435c94e4cf 261 260 2017-03-21T12:11:35Z wikipedia>Primefac 0 another update Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 86f4ea611fb7b0c5fa0313d800e80166afffd83f 262 261 2017-05-13T12:41:14Z wikipedia>Primefac 0 update from sandbox per [[Special:Diff/771417737]] Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91; ') end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext(' &#93;') end if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 502b3101de689fc8c04dd884e89c7667b09c3b2d 263 262 2018-04-09T12:43:15Z wikipedia>Primefac 0 implementing merger for [[Template:V]], [[Template:View]], and [[Template:Navbar]] Scribunto text/plain local p = {} local getArgs local ul function p.addItem (mini, full, link, descrip, args, url) local l if url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-'..full) :wikitext(l[1] .. link .. l[2]) :tag(args.mini and 'abbr' or 'span') :attr('title', descrip..' this template') :cssText(args.fontstyle) :wikitext(args.mini and mini or full) :done() :wikitext(l[3]) end function p.brackets (position, c, args, div) if args.brackets then div :tag('span') :css('margin-'..position, '-0.125em') :cssText(args.fontstyle) :wikitext(c) end end function p._navbar(args) local show = {true, true, true, false, false, false} local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end if args.template then titleArg = 'template' show = {true, false, false, false, false, false} local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do num = index[v] if num then show[num] = true end end end if args.noedit then show[3] = false end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template') if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end p.brackets('right', '&#91; ', args, div) ul = div:tag('ul') if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end if show[5] then local move = mw.title.new ('Special:Movepage') p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end p.brackets('left', ' &#93;', args, div) if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 60af96038f042b20adbaa15f2c9edef3e4ec0161 264 263 2018-04-09T13:08:56Z wikipedia>Trappist the monk 0 local div; fixed? Scribunto text/plain local p = {} local getArgs local ul function p.addItem (mini, full, link, descrip, args, url) local l if url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-'..full) :wikitext(l[1] .. link .. l[2]) :tag(args.mini and 'abbr' or 'span') :attr('title', descrip..' this template') :cssText(args.fontstyle) :wikitext(args.mini and mini or full) :done() :wikitext(l[3]) end function p.brackets (position, c, args, div) if args.brackets then div :tag('span') :css('margin-'..position, '-0.125em') :cssText(args.fontstyle) :wikitext(c) end end function p._navbar(args) local show = {true, true, true, false, false, false} local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end if args.template then titleArg = 'template' show = {true, false, false, false, false, false} local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do num = index[v] if num then show[num] = true end end end if args.noedit then show[3] = false end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template') if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end p.brackets('right', '&#91; ', args, div) ul = div:tag('ul') if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end if show[5] then local move = mw.title.new ('Special:Movepage') p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end p.brackets('left', ' &#93;', args, div) if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p a50bd1ca2109bc319ff03b4f20c74d78bb973133 265 264 2018-04-10T17:55:58Z wikipedia>Primefac 0 another local Scribunto text/plain local p = {} local getArgs local ul function p.addItem (mini, full, link, descrip, args, url) local l if url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-'..full) :wikitext(l[1] .. link .. l[2]) :tag(args.mini and 'abbr' or 'span') :attr('title', descrip..' this template') :cssText(args.fontstyle) :wikitext(args.mini and mini or full) :done() :wikitext(l[3]) end function p.brackets (position, c, args, div) if args.brackets then div :tag('span') :css('margin-'..position, '-0.125em') :cssText(args.fontstyle) :wikitext(c) end end function p._navbar(args) local show = {true, true, true, false, false, false} local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end if args.template then titleArg = 'template' show = {true, false, false, false, false, false} local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end if args.noedit then show[3] = false end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template') if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end p.brackets('right', '&#91; ', args, div) ul = div:tag('ul') if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end if show[5] then local move = mw.title.new ('Special:Movepage') p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end p.brackets('left', ' &#93;', args, div) if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 04f3b81927127526bd5d8bda44128b559fc97d0d Template:Template other 10 16 655 654 2017-04-10T09:49:10Z wikipedia>CambridgeBayWeather 0 Changed protection level for "[[Template:Template other]]": Request at RFPP ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 06fb13d264df967b5232141067eb7d2b67372d76 656 655 2018-12-16T22:06:25Z wikipedia>Amorymeltzer 0 Changed protection level for "[[Template:Template other]]": [[WP:High-risk templates|Highly visible template]]: Transclusion count has increased dramatically ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 06fb13d264df967b5232141067eb7d2b67372d76 Module:Message box 828 4 115 114 2017-10-02T09:03:51Z wikipedia>WOSlinker 0 change span to div to reduce lint errors Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local categoryHandler = require('Module:Category handler')._main local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return categoryHandler{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) cf608c39f8e58431672313b6262a42a31cb38c39 116 115 2018-04-10T12:58:17Z wikipedia>MSGJ 0 ony load Category handler when needed, requested on talk page Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then self.name = args.name if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small>''(%s)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 39d4071dc75c256d3094ce8a34e631eada1e3e2e 117 116 2018-12-21T10:26:33Z wikipedia>MSGJ 0 add class using template name, code requested by [[User:SD0001]] Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) ccc03cbba477975b372faac734dad441c34f9172 118 117 2019-02-28T20:36:10Z wikipedia>MSGJ 0 code requested by [[User:Danski454]] to fix demospace feature Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) aab916b126b6306dc8b5e6b2f81f992e2ca90342 Module:Yesno 828 3 51 50 2018-02-28T12:14:32Z wikipedia>MSGJ 0 +support for on/off Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or tonumber(val) == 0 then return false else return default end end f767643e7d12126d020d88d662a3dd057817b9dc Template:Infobox 10 11 587 586 2018-03-12T12:24:28Z wikipedia>Headbomb 0 per Template_talk:Infobox#Deploy_auto-categorization,_take_2 wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{#ifeq:{{NAMESPACE}}|Template|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> e6db96a81f994b02e93b537be937d443c0890566 588 587 2018-05-22T17:21:09Z wikipedia>Primefac 0 make it a template other wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}|{{SUBPAGENAME}}}}]]|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 4af02243c4a2c33cd8eded89028a0f3d7384ae98 589 588 2018-05-23T03:55:27Z wikipedia>Headbomb 0 Undid revision 842469519 by [[Special:Contributions/Primefac|Primefac]] ([[User talk:Primefac|talk]]) that does not behave the same way, test it on say [[Template:Music_of_sidebar]] your code categorizes it, the old one didn't wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{#ifeq:{{NAMESPACE}}|Template|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> e6db96a81f994b02e93b537be937d443c0890566 590 589 2018-06-01T17:05:09Z wikipedia>Primefac 0 no followup in a week, and a lack of other discussion means that while the two of us might not directly be the ones fixing the "wrong usage of infobox" templates, it *is* an option wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}|{{SUBPAGENAME}}}}]]|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 4af02243c4a2c33cd8eded89028a0f3d7384ae98 591 590 2018-06-08T14:43:21Z wikipedia>Primefac 0 HB was mostly right; until I can figure out how to only get the templates that transclude this template (and not any further down the pipeline) I'll just keep it at pages starting with "Template:Infobox". Also added a switch so that the (blank) cat text for this template isn't shown wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}}}]]}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> dd959f3414592616b310f0714a7cf96a1a39827d 592 591 2018-06-08T14:52:46Z wikipedia>Primefac 0 don't know how I messed that one up... wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 817a9f5b6524eced06a57bd1d5fd7179f9369bf2 593 592 2018-08-15T17:44:20Z wikipedia>Jdlrobson 0 #mobile moving width inline style to template style (part 1) wikitext text/x-wiki <templatestyles src="Infobox/styles.css" /> {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 710c6a63299811df0bc4687340482ba60c5ea300 594 593 2018-08-15T18:33:36Z wikipedia>Primefac 0 Undid revision 855063393 by [[Special:Contributions/Jdlrobson|Jdlrobson]] ([[User talk:Jdlrobson|talk]]) rather problematic change mentioned [[Template_talk:Infobox#Using_template_styles_to_reduce_technical_debt_inside_mobile_skin|on talk page]], reverting until it can be sorted wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 817a9f5b6524eced06a57bd1d5fd7179f9369bf2 MediaWiki:Gadget-switcher.js 8 38 1084 1083 2018-08-20T05:33:32Z wikipedia>Krinkle 0 Optimisations: Use $ from outer closure, consistently use self, remove redundant "/>", use querySelector for the initial check, combine append(), lower var scope where possible javascript text/javascript ( function () { 'use strict'; $( function () { $( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) { var activeElement; var elements = [], container = this, radioName = 'switcher-' + i; $( this ).children().each( function () { var self = this, $showRadio, $showAllRadio; var $labelContainer = $( self ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } elements.push( self ); $showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( self ).show(); activeElement = self; } ); $( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container ); if ( !activeElement ) { activeElement = self; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.is( '[data-switcher-default]' ) ) { $showRadio.click(); } else { $( self ).hide(); } $labelContainer.remove(); } ); if ( elements.length > 1 ) { $showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( elements ).show(); activeElement = elements; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } else if ( elements.length === 1 ) { $showRadio.remove(); } } ); } ); } )(); 941a2c49ebda13319e9636f11c1f1cb656748ce3 1085 1084 2018-08-22T16:56:20Z wikipedia>Krinkle 0 Move $showAllRadio declaration one scope upward javascript text/javascript ( function () { 'use strict'; $( function () { $( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) { var activeElement, $showAllRadio; var elements = [], container = this, radioName = 'switcher-' + i; $( this ).children().each( function () { var self = this, $showRadio; var $labelContainer = $( self ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } elements.push( self ); $showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( self ).show(); activeElement = self; } ); $( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container ); if ( !activeElement ) { activeElement = self; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.is( '[data-switcher-default]' ) ) { $showRadio.click(); } else { $( self ).hide(); } $labelContainer.remove(); } ); if ( elements.length > 1 ) { $showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( elements ).show(); activeElement = elements; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } else if ( elements.length === 1 ) { $showRadio.remove(); } } ); } ); } )(); 761c2b051e010341a8906f99decc633fe5e83f71 Module:Navbar/styles.css 828 15 627 2018-10-30T23:13:22Z wikipedia>Jdlrobson 0 Migrate Navbar styles from Mobile.css sanitized-css text/css body.skin-minerva .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline; white-space: nowrap; } .navbar li { word-spacing: -0.125em; } .navbar.mini li span { font-variant: small-caps; } /* Navbar styling when nested in infobox and navbox */ .navbox .navbar, .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; width: 6em; } 73c230ec5731114cb67aa35633995848b7168055 628 627 2018-10-30T23:16:45Z wikipedia>Jdlrobson 0 be safe and limit these to minerva for time being (but I think we can consolidate these with MediaWiki:Common.css) sanitized-css text/css body.skin-minerva .navbar { display: inline; font-size: 88%; font-weight: normal; } body.skin-minerva .navbar ul { display: inline; white-space: nowrap; } body.skin-minerva .navbar li { word-spacing: -0.125em; } .body.skin-minerva navbar.mini li span { font-variant: small-caps; } /* Navbar styling when nested in infobox and navbox */ body.skin-minerva .navbox .navbar, body.skin-minerva .infobox .navbar { font-size: 100%; } body.skin-minerva .navbox .navbar { display: block; } body.skin-minerva .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; width: 6em; } 633f803ffe9df1a82e6a0860e21b98f0ccf81ce8 Template:Hlist/styles.css 10 13 602 2018-10-30T23:21:28Z wikipedia>Jon (WMF) 0 [[WP:AES|←]]Created page with '.mw-parser-output .hlist ul, .mw-parser-output .hlist ol { padding-left: 0; } /* reset hlist margins of Minerva */ .mw-parser-output .hlist li, .mw-parser-outpu...' sanitized-css text/css .mw-parser-output .hlist ul, .mw-parser-output .hlist ol { padding-left: 0; } /* reset hlist margins of Minerva */ .mw-parser-output .hlist li, .mw-parser-output .hlist dd, .mw-parser-output .hlist dt { margin-right: 0; } .mw-parser-output .hlist li:after, .mw-parser-output .hlist dd:after { content: " · "; font-weight: bold; } .mw-parser-output .hlist dt:after { content: ": "; } /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist dd:last-child:after, .mw-parser-output .hlist dt:last-child:after, .mw-parser-output .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist dd dd:first-child:before, .mw-parser-output .hlist dd dt:first-child:before, .mw-parser-output .hlist dd li:first-child:before, .mw-parser-output .hlist dt dd:first-child:before, .mw-parser-output .hlist dt dt:first-child:before, .mw-parser-output .hlist dt li:first-child:before, .mw-parser-output .hlist li dd:first-child:before, .mw-parser-output .hlist li dt:first-child:before, .mw-parser-output .hlist li li:first-child:before { content: " ("; font-weight: normal; } /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist dd dd:last-child:after, .mw-parser-output .hlist dd dt:last-child:after, .mw-parser-output .hlist dd li:last-child:after, .mw-parser-output .hlist dt dd:last-child:after, .mw-parser-output .hlist dt dt:last-child:after, .mw-parser-output .hlist dt li:last-child:after, .mw-parser-output .hlist li dd:last-child:after, .mw-parser-output .hlist li dt:last-child:after, .mw-parser-output .hlist li li:last-child:after { content: ") "; font-weight: normal; } /* Put ordinals in front of ordered list items */ /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist ol { counter-reset: listitem; } /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist ol > li { counter-increment: listitem; } /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist ol > li:before { content: " " counter(listitem) " "; white-space: nowrap; } /* Should be removed and moved to templates once TemplateStyles is live */ .mw-parser-output .hlist dd ol > li:first-child:before, .mw-parser-output .hlist dt ol > li:first-child:before, .mw-parser-output .hlist li ol > li:first-child:before { content: " (" counter(listitem) " "; } 904f976b76c3d86638206f7a76518bbbe7c4dc4a Module:Message box/configuration 828 5 153 152 2018-11-14T23:08:35Z wikipedia>Amorymeltzer 0 Replace padlock images per [[Special:Permalink/868855944#Proposal/RFC: Redesigning page-protection padlock icons to be more accessible|RfC]] Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } e846b3e9e5e309778d237d8af7b0369864372136 154 153 2018-11-29T12:09:34Z wikipedia>Amorymeltzer 0 Use semi protection shackle with keyhole to genericize the protection icon, per talk page request Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } ef8171b8278c52d9c20a4149614d97cd948670c2 Module:Category handler 828 19 772 771 2018-12-16T20:12:57Z wikipedia>Amorymeltzer 0 Changed protection level for "[[Module:Category handler]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f Module:Arguments 828 2 24 23 2019-02-14T01:32:53Z w>MusikAnimal 0 Protected "[[Module:Arguments]]": High-risk template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 Module:Category handler/blacklist 828 23 820 818 2019-02-14T01:34:21Z w>MusikAnimal 0 Protected "[[Module:Category handler/blacklist]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 99582c2055a4d265f2760cc524c710b6f5d55d1a Module:Category handler/data 828 20 782 780 2019-02-14T01:34:55Z w>MusikAnimal 0 Protected "[[Module:Category handler/data]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 Module:Category handler/shared 828 21 793 791 2019-02-14T01:35:11Z w>MusikAnimal 0 Protected "[[Module:Category handler/shared]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 Module:Namespace detect/config 828 26 869 868 2019-02-14T01:35:50Z w>MusikAnimal 0 Protected "[[Module:Namespace detect/config]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/data 828 24 839 838 2019-02-14T01:37:00Z w>MusikAnimal 0 Protected "[[Module:Namespace detect/data]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:TableTools 828 7 228 227 2019-02-19T21:28:24Z wikipedia>Pppery 0 Implementing merger with [[Module:Table]] Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) local check = _check('keysToList') checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- This returns the length of a table, or the first integer key n counting from -- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. --]] function p.length(t) local i = 0 repeat i = i + 1 until t[i] == nil return i - 1 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 3b2176ba4dc996d59350ab9bfe8467b602bbb388 229 228 2019-02-19T21:35:25Z wikipedia>Pppery 0 Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- This returns the length of a table, or the first integer key n counting from -- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. --]] function p.length(t) local i = 0 repeat i = i + 1 until t[i] == nil return i - 1 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 0e07db88f86287cba540fd44481ce4bf32cccc6a Module:TableTools 828 7 230 229 2019-03-12T13:06:11Z wikipedia>Alex 21 0 Implementing talk page edit requested Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) if type(v) == 'number' and tostring(v) == '-nan' then return true else return false end end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- This returns the length of a table, or the first integer key n counting from -- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of -- the number of unnamed template parameters, so use this function for -- frame.args. --]] function p.length(t) local i = 1 while t[i] ~= nil do i = i + 1 end return i - 1 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p fe918509f168332267834b3a6f5c219a9de5b2e7 231 230 2019-12-21T03:39:49Z wikipedia>Pppery 0 Finally getting around to merging in [[Module:Array length]] (originally written by Mr. Stradivarius) over six months after writing the merged code, also minor code simplify per Dinoguy1000 on talk page Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) return type(v) == 'number' and tostring(v) == '-nan' end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') return s end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- Finds the length of an array, or of a quasi-array with keys such -- as "data1", "data2", etc., using an exponental search algorithm. -- It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of -- the number of unnamed template parameters, so use this function for -- frame.args. --]] function p.length(t, prefix) -- requiring module inline so that [[Module:Exponental search]] -- which is only needed by this one function -- doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function(i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 10d63665c0f270c54700b09e3e50126323fc3056 232 231 2020-05-23T15:51:01Z wikipedia>Dinoguy1000 0 from sandbox: another slight code simplification and a couple comment fixes Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) return type(v) == 'number' and tostring(v) == '-nan' end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- Finds the length of an array, or of a quasi-array with keys such -- as "data1", "data2", etc., using an exponential search algorithm. -- It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of -- the number of unnamed template parameters, so use this function for -- frame.args. --]] function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] -- which is only needed by this one function -- doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function(i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p ad3062fee63cdfb979a1543abf96236cf7bf609d Module:Category handler/config 828 22 810 808 2019-03-13T20:27:41Z w>Billinghurst 0 [866] = true, -- CNBanner Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book [866] = true, -- CNBanner [1198] = true, -- translations } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 366683bf9910d2e2473def54b0cc6dbad0b037d8 809 808 2019-04-27T19:05:05Z wikipedia>El C 0 Changed protection level for "[[Module:Category handler/config]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d 811 809 2020-04-01T06:12:40Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d Module:Category handler 828 19 773 772 2019-03-22T20:54:40Z w>Vogone 0 1 revision imported from [[:w:Module:Category_handler]]: per RFH Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f 774 773 2020-04-01T06:12:40Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f Module:Message box 828 4 119 118 2019-03-22T20:54:44Z w>Vogone 0 4 revisions imported from [[:w:Module:Message_box]]: per RFH Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) aab916b126b6306dc8b5e6b2f81f992e2ca90342 120 119 2020-04-01T06:12:44Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) and not self.isSmall then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) aab916b126b6306dc8b5e6b2f81f992e2ca90342 Module:Message box/configuration 828 5 155 154 2019-03-22T20:54:45Z w>Vogone 0 2 revisions imported from [[:w:Module:Message_box/configuration]]: per RFH Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } ef8171b8278c52d9c20a4149614d97cd948670c2 156 155 2020-04-01T06:12:44Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } ef8171b8278c52d9c20a4149614d97cd948670c2 Module:Yesno 828 3 52 51 2019-03-22T20:54:47Z w>Vogone 0 1 revision imported from [[:w:Module:Yesno]]: per RFH Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or tonumber(val) == 0 then return false else return default end end 12981c9a31eb2b0af1be4f16fc0642e180eac8c2 53 52 2020-04-01T06:12:47Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or tonumber(val) == 0 then return false else return default end end 12981c9a31eb2b0af1be4f16fc0642e180eac8c2 54 53 2020-04-01T06:27:55Z wikipedia>MusikAnimal 0 Undid revision 948472533 by [[Special:Contributions/w>Vogone|w>Vogone]] ([[User talk:w>Vogone|talk]]) Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or tonumber(val) == 0 then return false else return default end end f767643e7d12126d020d88d662a3dd057817b9dc Module:Category handler/shared 828 21 792 791 2019-04-27T19:03:28Z wikipedia>El C 0 Changed protection level for "[[Module:Category handler/shared]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 794 792 2020-04-01T06:12:41Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 Module:Category handler/data 828 20 781 780 2019-04-27T19:04:53Z wikipedia>El C 0 Changed protection level for "[[Module:Category handler/data]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 783 781 2020-04-01T06:12:41Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 Module:Category handler/blacklist 828 23 819 818 2019-04-27T19:05:17Z wikipedia>El C 0 Changed protection level for "[[Module:Category handler/blacklist]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 99582c2055a4d265f2760cc524c710b6f5d55d1a 821 819 2020-04-01T06:12:40Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template messages/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 99582c2055a4d265f2760cc524c710b6f5d55d1a 822 821 2020-04-18T08:48:05Z wikipedia>Jo-Jo Eumerus 0 Per category talk page Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template index/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855 Module:Message box/ambox.css 828 27 872 2019-07-12T22:58:24Z wikipedia>Ladsgroup 0 Trying to use [[mw:TemplateStyles]] sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } e0dc177f0ab86a239e414462300e547e73a11d52 873 872 2019-07-23T14:00:37Z wikipedia>TheDJ 0 sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Take into account templatestyles between two amboxes */ table.ambox + link + link + table.ambox, table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } 7f9644eec4ddacad611ed8fa4b27dab06d4ecba8 874 873 2019-07-23T21:56:22Z wikipedia>TheDJ 0 add compact form, but without images, as they don't work unless uploaded to Commons. sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Take into account templatestyles between two amboxes */ table.ambox + link + link + table.ambox, table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* Style for compact ambox, as used inside multiple issues etc. */ /* Hide the images */ .compact-ambox table .mbox-image, .compact-ambox table .mbox-imageright, .compact-ambox table .mbox-empty-cell { display: none; } /* Remove borders, backgrounds, padding, etc. */ .compact-ambox table.ambox { border: none; border-collapse: collapse; background-color: transparent; margin: 0 0 0 1.6em !important; padding: 0 !important; width: auto; display: block; } .compact-ambox table.mbox-small-left.mbox-small-left { font-size: 100%; width: auto; margin: 0; } /* Style the text cell as a list item and remove its padding */ .compact-ambox table .mbox-text { padding: 0 !important; margin: 0 !important; } .compact-ambox table .mbox-text-span { display: list-item; line-height: 1.5em; list-style-type: square; /*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/ } .skin-vector .compact-ambox table .mbox-text-span { list-style-type: disc; /*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/ } /* Allow for hiding text in compact form */ .compact-ambox .hide-when-compact { display: none; } f9cadc253b407f1cda7273fe3f33a87a3194747a Module:Infobox 828 10 348 347 2019-07-13T12:47:29Z wikipedia>Gonnym 0 Added more options to Italic Title per discussion at [[Template talk:Infobox#Italics part deux]] Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end --[[ Function handles the page's title italicization. -- If the value of "italic title" is set to "force" or "yes", titles with no parentheses () are fully italicised, and titles which contain parentheses are italicised before the first opening parenthesis. -- If the value of "italic title" is set to "all", the complete title, including the text in parentheses is italicized. -- If the value of "italic_string" is entered, instead of italicizing the whole title, it will italicize only some specific text. -- Note that if the specific text is in the disambiguation then both |italic title=all and |italic_string=<text> will need to be used. -- -- Optionale combinations: --- No italics. --- Italicized page name without disambiguation. --- Italicized complete page name, including parentheses. --- Italicized part of the text, not including disambiguation. --- Italicized part of the text, including parentheses. --]] local function renderItalicTitle() local italicTitleModule = require("Module:Italic title")._main local italicTitleOption = args['italic title'] local italicTitleString = args['italic_string'] local italicTitleArg = {} if (italicTitleOption) then local italicLowercase = mw.ustring.lower(italicTitleOption) if (italicLowercase == "no") then -- If set to "no" or any other disabling parameter, do nothing. return elseif (italicLowercase == '' or italicLowercase == 'force' or italicLowercase == 'yes') then root:wikitext(italicTitleModule({})) return elseif (italicLowercase == 'all') then italicTitleArg.all = "yes" else -- Do nothing. return end end if (italicTitleString) then italicTitleArg.string = italicTitleString end root:wikitext(italicTitleModule(italicTitleArg)) end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('italic_string') preprocessSingleArg('decat') return _infobox() end return p 5990fa89ee350801adeefbf2327bf9c23bf2026b 349 348 2019-07-13T13:05:36Z wikipedia>Gonnym 0 Undid revision 906073835 by [[Special:Contributions/Gonnym|Gonnym]] ([[User talk:Gonnym|talk]]) errors in code were reported Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 86cf80d64495ad16eb12aa533ca749c55689b02d 350 349 2020-05-13T14:37:24Z wikipedia>Frietjes 0 tracking with [[Category:Pages which use infobox templates with ignored data cells]] for discussion on talk page Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 9700b88bc345188e17f2de76d333a3522e0d91f0 351 350 2020-05-13T19:13:58Z wikipedia>Frietjes 0 fix for categories triggering blank data cells per talk page (and spaces to tabs per edits by RexxS) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local row_style for k, num in ipairs(rownums) do local dval = args['data' .. tostring(num)] if dval and dval:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S') then row_style = args['rowstyle' .. tostring(num)] else row_style = 'display:none' end addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = row_style, rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 512f468410d1b4e10f4aa2dc1a9c34a78c3f97d2 352 351 2020-05-13T19:49:01Z wikipedia>Galobtter 0 Undid revision 956509357 by [[Special:Contributions/Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) breaks headers in infobox Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 9700b88bc345188e17f2de76d333a3522e0d91f0 353 352 2020-05-13T19:50:38Z wikipedia>Frietjes 0 fixed Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local row_style for k, num in ipairs(rownums) do local dval = args['data' .. tostring(num)] row_style = args['rowstyle' .. tostring(num)] if args['header' .. tostring(num)] then row_style = args['rowstyle' .. tostring(num)] elseif dval and dval:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S') then row_style = args['rowstyle' .. tostring(num)] else row_style = 'display:none' end addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = row_style, rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 36a50f278b0ac8c41e9611c12b92dab86915f2fa 354 353 2020-05-13T20:01:15Z wikipedia>Frietjes 0 simplify (tested in sandbox) Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 40797e66730e34f0f58a00e31e35791b2cb0892f 355 354 2020-05-16T21:14:51Z wikipedia>Ahecht 0 Allow arguments passed via #invoke to override those passed into the invoking template. Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- Allow arguments passed via #invoke to override those passed into the invoking template. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args end for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p d15cb4d9abd4983eed52ff42b6cbe401cb099d7b 356 355 2020-05-16T21:23:56Z wikipedia>Ahecht 0 Undid revision 957070706 by [[Special:Contributions/Ahecht|Ahecht]] ([[User talk:Ahecht|talk]]) - Undo for now, not very useful due to parameter name collisions Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') return _infobox() end return p 40797e66730e34f0f58a00e31e35791b2cb0892f 357 356 2020-05-16T21:37:05Z wikipedia>Ahecht 0 sync p.infoboxTemplate(frame) from sandbox Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.parseDataParameters() -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame.args end p.parseDataParameters() return _infobox() end function p.infoboxTemplate(frame) -- For calling via #invoke within a template origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end p.parseDataParameters() return _infobox() end return p f5c416765d3d36c8ef46a4856eb41d40da2d99c4 358 357 2020-05-16T23:04:02Z wikipedia>Ahecht 0 fix Attempt to index upvalue 'origArgs' error Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs = {} local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.parseDataParameters() -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame.args end p.parseDataParameters() return _infobox() end function p.infoboxTemplate(frame) -- For calling via #invoke within a template origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end p.parseDataParameters() return _infobox() end return p 734e18d984cca6d9679e7294cc58c49806a0ea22 359 358 2020-05-16T23:07:44Z wikipedia>Ahecht 0 Fix "attempt to index upvalue 'origArgs' (a nil value)" Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs = {} local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end local function parseDataParameters() -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end function p.infoboxTemplate(frame) -- For calling via #invoke within a template origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p ed839c86f4c203e2042309262419c4d849d29fa2 360 359 2020-06-25T19:04:15Z wikipedia>Frietjes 0 per discussion on the talkpage, now supports |autoheaders=y Scribunto text/plain -- -- This module implements {{Infobox}} -- local p = {} local navbar = require('Module:Navbar')._navbar local args = {} local origArgs = {} local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs.header and rowArgs.header ~= '_BLANK_' then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass) :css('text-align', 'center') :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]') end elseif rowArgs.data then if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then rowArgs.rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)], datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end local function preprocessRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end local function renderRows() -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], dataid = args['dataid' .. tostring(num)], labelid = args['labelid' .. tostring(num)], headerid = args['headerid' .. tostring(num)], rowid = args['rowid' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' then if args.child == 'yes' then if args.title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end end local function _infobox() -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if args.child ~= 'yes' then root = mw.html.create('table') root :addClass((args.subbox ~= 'yes') and 'infobox' or nil) :addClass(args.bodyclass) if args.subbox == 'yes' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() if args.autoheaders then preprocessRows() end renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Assign the parameters with the given prefixes to the args table, in order, in batches -- of the step size specified. This is to prevent references etc. from appearing in the -- wrong order. The prefixTable should be an array containing tables, each of which has -- two possible fields, a "prefix" string and a "depend" table. The function always parses -- parameters containing the "prefix" string, but only parses parameters in the "depend" -- table if the prefix parameter is present and non-blank. if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present and not blank, or -- we are processing "prefix1" and "prefix" is present and not blank, and -- if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end local function parseDataParameters() -- Parse the data parameters in the same order that the old {{infobox}} did, so that -- references etc. will display in the expected places. Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent preprocessSingleArg('decat') end function p.infobox(frame) -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end function p.infoboxTemplate(frame) -- For calling via #invoke within a template origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 9d2795ab84d3da6331700b3705be9ac5a8578732 MediaWiki:Gadget-switcher.js 8 38 1086 1085 2019-09-18T02:30:39Z wikipedia>Krinkle 0 Maintenance: Remove redundant closure javascript text/javascript 'use strict'; $( function () { $( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) { var activeElement, $showAllRadio; var elements = [], container = this, radioName = 'switcher-' + i; $( this ).children().each( function () { var self = this, $showRadio; var $labelContainer = $( self ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } elements.push( self ); $showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( self ).show(); activeElement = self; } ); $( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container ); if ( !activeElement ) { activeElement = self; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.is( '[data-switcher-default]' ) ) { $showRadio.click(); } else { $( self ).hide(); } $labelContainer.remove(); } ); if ( elements.length > 1 ) { $showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( elements ).show(); activeElement = elements; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } else if ( elements.length === 1 ) { $showRadio.remove(); } } ); } ); b37e285775e8a43bd568dedef3a9c9328eb5944d 1087 1086 2019-09-18T03:01:56Z wikipedia>Krinkle 0 Maintenance: Various optimisations - fewer DOM/jQuery operations, less Sizzle selector overhead, avoid post-append mutation javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i ) { var activeElement, $showAllRadio; var switchers = [], container = this, radioName = 'switcher-' + i; $.each( this.children, function () { var switcher = this, $showRadio; var $labelContainer = $( switcher ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } switchers.push( switcher ); $showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( switcher ).show(); activeElement = switcher; } ); if ( !activeElement ) { activeElement = switcher; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) { $showRadio.click(); } else { $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container ); $labelContainer.remove(); } ); if ( switchers.length > 1 ) { $showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( switchers ).show(); activeElement = switchers; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } if ( switchers.length === 1 ) { $showRadio.remove(); } } ); } ); 62c833c54a58e62658062682cf5171adb22b7053 1088 1087 2019-09-18T03:02:20Z wikipedia>Krinkle 0 Add some comments javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i ) { var activeElement, $showAllRadio; var switchers = [], container = this, radioName = 'switcher-' + i; $.each( this.children, function () { var switcher = this, $showRadio; var $labelContainer = $( switcher ).find( '.switcher-label' ); var $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } switchers.push( switcher ); $showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( switcher ).show(); activeElement = switcher; } ); if ( !activeElement ) { // Mark the first one as selected activeElement = switcher; $showRadio.prop( 'checked', true ); } else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) { // Custom default $showRadio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container ); $labelContainer.remove(); } ); if ( switchers.length > 1 ) { $showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( switchers ).show(); activeElement = switchers; } ); $( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container ); } if ( switchers.length === 1 ) { $showRadio.remove(); } } ); } ); ed66cce8cb5d2d937c4bb64c7802806f9305fa40 1089 1088 2019-09-18T03:09:44Z wikipedia>Krinkle 0 Maintenance: More optimisations (tested on [[Template:Switcher/testcases]] and [[Broadway Hollywood Building]]) javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i ) { var activeElement, switchers = [], container = this, radioName = 'switcher-' + i; $.each( this.children, function () { var $radio, switcher = this, $labelContainer = $( switcher.querySelector('.switcher-label') ), $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } switchers.push( switcher ); $radio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( switcher ).show(); activeElement = switcher; } ); if ( !activeElement ) { // Mark the first one as selected activeElement = switcher; $radio.prop( 'checked', true ); } else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, $labelText ).appendTo( container ); $labelContainer.remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( switchers ).show(); activeElement = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); eae425dd54469f59bfc49441c77e06d5dff4c02c Module:Navbar 828 8 266 265 2019-11-07T01:08:05Z w>MusikAnimal 0 Protected "[[Module:Navbar]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)) Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e 267 266 2020-04-01T06:12:45Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain local p = {} local getArgs function p._navbar(args) local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left; width:6em;' end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template'); if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end if args.brackets then div :tag('span') :css('margin-right', '-0.125em') :cssText(args.fontstyle) :wikitext('&#91;') :newline(); end local ul = div:tag('ul'); ul :tag('li') :addClass('nv-view') :wikitext('[[' .. title.fullText .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'View this template') :cssText(args.fontstyle) :wikitext(args.mini and 'v' or 'view') :done() :wikitext(']]') :done() :tag('li') :addClass('nv-talk') :wikitext('[[' .. talkpage .. '|') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Discuss this template') :cssText(args.fontstyle) :wikitext(args.mini and 't' or 'talk') :done() :wikitext(']]'); if not args.noedit then ul :tag('li') :addClass('nv-edit') :wikitext('[' .. title:fullUrl('action=edit') .. ' ') :tag(args.mini and 'abbr' or 'span') :attr('title', 'Edit this template') :cssText(args.fontstyle) :wikitext(args.mini and 'e' or 'edit') :done() :wikitext(']'); end if args.brackets then div :tag('span') :css('margin-left', '-0.125em') :cssText(args.fontstyle) :wikitext('&#93;') :newline(); end if args.collapsible then div :done() :tag('span') :css('font-size', '110%') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e 268 267 2020-04-01T06:30:21Z wikipedia>MusikAnimal 0 Undid revision 948472521 by [[Special:Contributions/w>MusikAnimal|w>MusikAnimal]] ([[User talk:w>MusikAnimal|talk]]) Scribunto text/plain local p = {} local getArgs local ul function p.addItem (mini, full, link, descrip, args, url) local l if url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-'..full) :wikitext(l[1] .. link .. l[2]) :tag(args.mini and 'abbr' or 'span') :attr('title', descrip..' this template') :cssText(args.fontstyle) :wikitext(args.mini and mini or full) :done() :wikitext(l[3]) end function p.brackets (position, c, args, div) if args.brackets then div :tag('span') :css('margin-'..position, '-0.125em') :cssText(args.fontstyle) :wikitext(c) end end function p._navbar(args) local show = {true, true, true, false, false, false} local titleArg = 1 if args.collapsible then titleArg = 2 if not args.plain then args.mini = 1 end if args.fontcolor then args.fontstyle = 'color:' .. args.fontcolor .. ';' end args.style = 'float:left; text-align:left' end if args.template then titleArg = 'template' show = {true, false, false, false, false, false} local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end if args.noedit then show[3] = false end local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local title = mw.title.new(mw.text.trim(titleText), 'Template') if not title then error('Invalid title ' .. titleText) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' local div = mw.html.create():tag('div') div :addClass('plainlinks') :addClass('hlist') :addClass('navbar') :cssText(args.style) if args.mini then div:addClass('mini') end if not (args.mini or args.plain) then div :tag('span') :css('word-spacing', 0) :cssText(args.fontstyle) :wikitext(args.text or 'This box:') :wikitext(' ') end p.brackets('right', '&#91; ', args, div) ul = div:tag('ul') if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end if show[5] then local move = mw.title.new ('Special:Movepage') p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end p.brackets('left', ' &#93;', args, div) if args.collapsible then div :done() :tag('div') :css('font-size', '114%') :css('margin', args.mini and '0 4em' or '0 7em') :cssText(args.fontstyle) :wikitext(args[1]) end return tostring(div:done()) end function p.navbar(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._navbar(getArgs(frame)) end return p 04f3b81927127526bd5d8bda44128b559fc97d0d Template:Ambox 10 18 749 748 2020-04-01T06:12:33Z wikipedia>MusikAnimal 0 1 revision imported wikitext text/x-wiki {{#invoke:Message box|ambox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> bf0ee50293a043290608e9f2a2c54ec194e9cdeb 750 749 2020-04-01T06:36:53Z wikipedia>MusikAnimal 0 Undid revision 948472448 by [[Special:Contributions/w>MarcoAurelio|w>MarcoAurelio]] ([[User talk:w>MarcoAurelio|talk]]) wikitext text/x-wiki {{#invoke:Message box|ambox}}{{#ifeq:{{{small}}}|left|[[Category:Articles using small message boxes]]}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> a2c8099e3f9edd2e67527dd554f50790a79fff03 Module:Arguments 828 2 25 24 2020-04-01T06:12:40Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 Module:Namespace detect/config 828 26 870 869 2020-04-01T06:12:44Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/data 828 24 840 839 2020-04-01T06:12:45Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:Message box 828 4 121 120 2020-08-03T15:47:52Z wikipedia>MSGJ 0 show link to talk discussion when used in small format, per request Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('small') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) fcb7e5c5edcd23c62b8dc64ad6f4fcf981be83c1 122 121 2021-06-06T18:51:34Z wikipedia>Izno 0 per tper Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'>''(<span class='date'>%s</span>)''</span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) b1fd4c365d29a34bbcf3aef2adec6701ed0efe45 Module:TableTools 828 7 233 232 2020-10-11T22:22:43Z wikipedia>GorillaWarfare 0 Changed protection level for "[[Module:TableTools]]": [[WP:High-risk templates|High-risk Lua module]]: bumping protection level due to high usage, plus the stability of the module. See https://en.wikipedia.org/w/index.php?title=Wikipedia:Requests_for_page_protection&oldid=983044034#Module:TableTools ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain --[[ ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should -- -- not be called directly from #invoke. -- ------------------------------------------------------------------------------------ --]] local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti --[[ ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ --]] function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end --[[ ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a value can be a valid table key. Lua will -- generate an error if a NaN is used as a table key. ------------------------------------------------------------------------------------ --]] function p.isNan(v) return type(v) == 'number' and tostring(v) == '-nan' end --[[ ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ --]] function p.shallowClone(t) local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end --[[ ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ --]] function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for i, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end --[[ ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ --]] function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k, v in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will -- return {1, 3, 6}. ------------------------------------------------------------------------------------ --]] function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k, v in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end --[[ ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table -- of subtables in the format -- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} } -- Keys that don't end with an integer are stored in a subtable named "other". -- The compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end --[[ ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ --]] function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end --[[ ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ --]] function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end --[[ ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ --]] function p.size(t) checkType('size', 1, t, 'table') local i = 0 for k in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 else -- This will fail with table, boolean, function. return item1 < item2 end end --[[ Returns a list of the keys in a table, sorted using either a default comparison function or a custom keySort function. ]] function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' }) end local list = {} local index = 1 for key, value in pairs(t) do list[index] = key index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(list, keySort) end return list end --[[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, sparseIpairs is probably more efficient. ]] function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local list = p.keysToList(t, keySort, true) local i = 0 return function() i = i + 1 local key = list[i] if key ~= nil then return key, t[key] else return nil, nil end end end --[[ Returns true if all keys in the table are consecutive integers starting at 1. --]] function p.isArray(t) checkType("isArray", 1, t, "table") local i = 0 for k, v in pairs(t) do i = i + 1 if t[i] == nil then return false end end return true end -- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 } function p.invert(array) checkType("invert", 1, array, "table") local map = {} for i, v in ipairs(array) do map[v] = i end return map end --[[ { "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true } --]] function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end --[[ Recursive deep copy function. Preserves identities of subtables. ]] local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = deepcopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end --[[ Concatenates all values in the table that are indexed by a number, in order. sparseConcat{ a, nil, c, d } => "acd" sparseConcat{ nil, b, c, d } => "bcd" ]] function p.sparseConcat(t, sep, i, j) local list = {} local list_i = 0 for _, v in p.sparseIpairs(t) do list_i = list_i + 1 list[list_i] = v end return table.concat(list, sep, i, j) end --[[ -- Finds the length of an array, or of a quasi-array with keys such -- as "data1", "data2", etc., using an exponential search algorithm. -- It is similar to the operator #, but may return -- a different value when there are gaps in the array portion of the table. -- Intended to be used on data loaded with mw.loadData. For other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of -- the number of unnamed template parameters, so use this function for -- frame.args. --]] function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] -- which is only needed by this one function -- doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function(i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p ad3062fee63cdfb979a1543abf96236cf7bf609d Module:Navbar/styles.css 828 15 629 628 2020-12-03T08:25:17Z wikipedia>Izno 0 integrate 2 sheets sanitized-css text/css /* CSS below is common */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } body.skin-Minerva .navbar ul { display: inline; /* why does mobile differ here? */ } .navbar li { word-spacing: -0.125em; } /* Space reserved for remaining common fixes. */ /* Navbar styling when nested in infobox and navbox */ /* Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* CSS below is from Common.css */ .mw-body-content .navbar ul { line-height: inherit; /* Why is this missing in Minerva? */ } .navbar.mini li abbr[title] { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* CSS below is from Mobile.css */ .navbar.mini li span { font-variant: small-caps; /* This just looks like it missed the update to abbr */ } d842041b3d584f8b3d38021253889aff1a4fb342 630 629 2020-12-03T08:27:49Z wikipedia>Izno 0 poke sanitized-css text/css /* CSS below is common */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } body.skin-Minerva .navbar ul { display: inline; /* why does mobile differ here? */ } .navbar li { word-spacing: -0.125em; } /* Space reserved for remaining common fixes. */ /* Navbar styling when nested in infobox and navbox */ /* Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* CSS below is from Common.css */ .mw-body-content .navbar ul { line-height: inherit; /* Why is this missing in Minerva? */ } .navbar.mini li abbr[title] { /* Not entirely certain why this is restricted to abbr with title; all abbrs must have a title */ font-variant: small-caps; /* Below 3 rules missing from Minerva */ border-bottom: none; text-decoration: none; cursor: inherit; } /* CSS below is from Mobile.css */ .navbar.mini li span { font-variant: small-caps; /* This just looks like it missed the update to abbr */ } 724cc7b713b703bd26cd0a28d89fc234a54c0255 631 630 2020-12-03T20:44:32Z wikipedia>Izno 0 Izno moved page [[Template:Navbar/styles.css]] to [[Module:Navbar/styles.css]] without leaving a redirect: navbar is implemented in module space sanitized-css text/css /* CSS below is common */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } body.skin-Minerva .navbar ul { display: inline; /* why does mobile differ here? */ } .navbar li { word-spacing: -0.125em; } /* Space reserved for remaining common fixes. */ /* Navbar styling when nested in infobox and navbox */ /* Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* CSS below is from Common.css */ .mw-body-content .navbar ul { line-height: inherit; /* Why is this missing in Minerva? */ } .navbar.mini li abbr[title] { /* Not entirely certain why this is restricted to abbr with title; all abbrs must have a title */ font-variant: small-caps; /* Below 3 rules missing from Minerva */ border-bottom: none; text-decoration: none; cursor: inherit; } /* CSS below is from Mobile.css */ .navbar.mini li span { font-variant: small-caps; /* This just looks like it missed the update to abbr */ } 724cc7b713b703bd26cd0a28d89fc234a54c0255 632 631 2020-12-04T05:00:42Z wikipedia>Izno 0 clean sanitized-css text/css /* CSS below is common */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar li { word-spacing: -0.125em; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar-c-title-full { font-size: 114%; margin: 0 7em; } .navbar-c-title-mini { font-size: 114%; margin: 0 4em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* Navbar styling when nested in infobox and navbox */ /* Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* body.everyoneelse */ .mw-body-content .navbar ul { line-height: inherit; } 27c9d9fe2958792e85262372fded68e8a7b23b27 633 632 2020-12-04T08:21:57Z wikipedia>Izno 0 ct full/mini sanitized-css text/css /* CSS below is common */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar li { word-spacing: -0.125em; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* body.everyoneelse */ .mw-body-content .navbar ul { line-height: inherit; } b6aa524cdc6a5356a7d4ec1b9f300d4a609d0178 634 633 2020-12-04T08:22:13Z wikipedia>Izno 0 poke sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar li { word-spacing: -0.125em; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } body.skin-Minerva .navbox-title .navbar { width: 6em; /* Why does mobile set this width? */ } /* body.everyoneelse */ .mw-body-content .navbar ul { line-height: inherit; } 7d8cbeeafb751d8dbd7e9cbb9ab06f22287d4ffb 635 634 2020-12-04T09:56:14Z wikipedia>Izno 0 remove per research sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar li { word-spacing: -0.125em; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } /* body.everyoneelse */ .mw-body-content .navbar ul { line-height: inherit; } 5a0a446dfcd428aa8815ddbe505f5305085563a8 636 635 2020-12-04T09:59:16Z wikipedia>Izno 0 and move that out of more specific rule sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar li { word-spacing: -0.125em; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } b43dea8c4602e5f62a6ddd8a013b450f121b6d9e 637 636 2020-12-04T10:02:08Z wikipedia>Izno 0 pokity poke poke sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar li { word-spacing: -0.125em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } c04e50b7d27ccc73aca5a04aa83961ec93f7ed7c 638 637 2020-12-06T15:07:28Z wikipedia>Izno 0 add brackets in css sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar-brackets::before { margin-right: -0.125em; content: '&#91; '; } .navbar-brackets::after { margin-left: -0.125em; content: ' &#93;'; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar li { word-spacing: -0.125em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 66a13fdd3896f1fd1dbe5857852975cbc613a516 639 638 2020-12-06T15:13:02Z wikipedia>Izno 0 ok, not html character references sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar ul::before { margin-right: -0.125em; content: '[ '; } .navbar ul::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 1b4226e282324c4597a1097338a61ab9329c83d2 640 639 2020-12-06T15:29:10Z wikipedia>Izno 0 navbar-brackets sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar.mini li abbr, .navbar.mini li span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 6cdf96ac530c44446f4a89023dc55972f10d81d6 641 640 2020-12-06T15:41:24Z wikipedia>Izno 0 move to navbar-mini sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar-lbracket { margin-right: -0.125em; } .navbar-rbracket { margin-left: -0.125em; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 075ae8b1bf93d3ab3164745e44df145ec18e3c9e 642 641 2020-12-06T15:42:30Z wikipedia>Izno 0 nix lrbrackets sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; /* marginally cheaper to have two rules of 114% */ margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } c4069ef94c9c286ea80fb1d67bf5e736f3ac4d42 643 642 2020-12-07T13:53:14Z wikipedia>Izno 0 clean sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 37ca9bd8221b073fa7bea5872a7286e1de464591 644 643 2020-12-08T00:14:03Z wikipedia>Izno 0 Protected "[[Module:Navbar/styles.css]]": [[WP:High-risk templates|Highly visible template]]: match to parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) sanitized-css text/css .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 37ca9bd8221b073fa7bea5872a7286e1de464591 645 644 2020-12-08T00:14:21Z wikipedia>Izno 0 pp sanitized-css text/css /* {{pp}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } b60bbd981b8db453c19da2ab22efba9f8a2989da 646 645 2020-12-08T00:14:55Z wikipedia>Izno 0 small = yes sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr, .navbar-mini span { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 45128057f0613cb50232122102db636b7e9104ba 647 646 2020-12-08T00:40:59Z wikipedia>Izno 0 navbar-mini is never a span, and span doesn't have all the stuff that needs resetting sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } f4cf6b1111f177ad6af0154b14f9c942400f3636 Module:Navbar/configuration 828 9 276 2020-12-04T07:55:17Z wikipedia>Izno 0 move configuration to own pile Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', ['left_bracket'] = '&#91; ', -- '[ ' ['right_bracket'] = ' &#93;', -- ' ]' ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['left_bracket'] = 'navbar-lbracket', ['right_bracket'] = 'navbar-rbracket', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full', } } return configuration c7af768ce91d241090272d6ae8f00e1f14d45ea8 277 276 2020-12-04T07:56:13Z wikipedia>Izno 0 Izno moved page [[Module:Navbar/configuration/sandbox]] to [[Module:Navbar/configuration]] without leaving a redirect Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', ['left_bracket'] = '&#91; ', -- '[ ' ['right_bracket'] = ' &#93;', -- ' ]' ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['left_bracket'] = 'navbar-lbracket', ['right_bracket'] = 'navbar-rbracket', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full', } } return configuration c7af768ce91d241090272d6ae8f00e1f14d45ea8 278 277 2020-12-04T08:55:15Z wikipedia>Izno 0 add title_namespace Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['left_bracket'] = '&#91; ', -- '[ ' ['right_bracket'] = ' &#93;', -- ' ]' ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['left_bracket'] = 'navbar-lbracket', ['right_bracket'] = 'navbar-rbracket', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full', } } return configuration 8b0ba25d0008d79d490c4c93b099307f9f3812fe 279 278 2020-12-06T15:04:35Z wikipedia>Izno 0 add brackets class Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['left_bracket'] = '&#91; ', -- '[ ' ['right_bracket'] = ' &#93;', -- ' ]' ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', ['left_bracket'] = 'navbar-lbracket', ['right_bracket'] = 'navbar-rbracket', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 9a1ccb316f07e5b360f9e85f5c30751af347bc93 280 279 2020-12-06T15:30:56Z wikipedia>Izno 0 and remove other brackets here Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 256d986172004b862600a101f6359f0ceca67e98 281 280 2020-12-06T15:43:28Z wikipedia>Izno 0 navbar-mini Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 9fce7d2a595431f2b190834dac2ca6ea68c0ed6d 282 281 2020-12-07T19:45:50Z wikipedia>Izno 0 save this Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' }, ['default_links'] = { -- configure true/false. -- if you add/remove one, don't forget to update link_descriptions also ['view'] = true, ['talk'] = true, ['edit'] = true, ['hist'] = false, ['move'] = false, ['watch'] = false } } return configuration 07e5e8f01b5d4cd2f93bb649ae603d17c8429631 283 282 2020-12-07T19:51:37Z wikipedia>Izno 0 Undid revision 992912931 by [[Special:Contributions/Izno|Izno]] ([[User talk:Izno|talk]]) nope Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 9fce7d2a595431f2b190834dac2ca6ea68c0ed6d 284 283 2020-12-07T20:14:37Z wikipedia>Izno 0 move some link_descriptions here Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' }, link_descriptions = { -- if you add an option to this, don't forget to update show and -- link_descriptions_links ['view'] = { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['url'] = false }, ['talk'] = { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['url'] = false }, ['edit'] = { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['url'] = true }, ['hist'] = { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['url'] = true }, ['move'] = { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['url'] = true }, ['watch'] = { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['url'] = true } } } return configuration 6e447d8dc655de876854be79910acdf09d6273b6 285 284 2020-12-07T20:36:25Z wikipedia>Izno 0 commas hard Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' }, link_descriptions = { -- if you add an option to this, don't forget to update show and -- link_descriptions_links ['view'] = { ['default_enabled'] = true, ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['url'] = false }, ['talk'] = { ['default_enabled'] = true, ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['url'] = false }, ['edit'] = { ['default_enabled'] = true, ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['url'] = true }, ['hist'] = { ['default_enabled'] = false, ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['url'] = true }, ['move'] = { ['default_enabled'] = false, ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['url'] = true }, ['watch'] = { ['default_enabled'] = false, ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['url'] = true } } } return configuration 43786aaeadf16f33327abd8b3fe341016f56cb39 286 285 2020-12-07T20:45:52Z wikipedia>Izno 0 hmm Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' }, link_descriptions = { -- if you add an option to this, don't forget to update show and -- link_descriptions_links view = { ['default_enabled'] = true, ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['url'] = false }, talk = { ['default_enabled'] = true, ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['url'] = false }, edit = { ['default_enabled'] = true, ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['url'] = true }, hist = { ['default_enabled'] = false, ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['url'] = true }, move = { ['default_enabled'] = false, ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['url'] = true }, watch = { ['default_enabled'] = false, ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['url'] = true } } } return configuration d46401a7d18b9a9c31cb1553b336d1e435c014c0 287 286 2020-12-07T20:48:30Z wikipedia>Izno 0 remove link_descriptions Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- translate or set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 9fce7d2a595431f2b190834dac2ca6ea68c0ed6d 288 287 2020-12-08T00:16:09Z wikipedia>Izno 0 poke Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 7f1b6300bc4a690ecfb1c83b582f36c603bd1dff 289 288 2020-12-08T00:17:17Z wikipedia>Izno 0 Protected "[[Module:Navbar/configuration]]": match parent template ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) Scribunto text/plain local configuration = { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } return configuration 7f1b6300bc4a690ecfb1c83b582f36c603bd1dff Module:Navbar 828 8 269 268 2020-12-08T00:35:00Z wikipedia>Izno 0 some refactoring + templatestyles Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p a5c8d3a8f8beb18984ea7f145ddbdf88a065d23e 270 269 2021-08-24T17:32:47Z wikipedia>WOSlinker 0 add text-decoration:inherit; so that underlined hover is in same color at text Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end font_style = (font_style or '') .. ';text-decoration:inherit;' local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p daf988cd3d1f449dbc3ff6129578c8bec3dd9ec4 MediaWiki:Gadget-switcher.js 8 38 1090 1089 2021-02-26T16:09:52Z wikipedia>Jon (WMF) 0 maintenance: [[metawiki:User:Jon_(WMF)/Edit_to_user_or_gadget_script|more info]] Uncaught ReferenceError: $radio is not defined (scope is wrong given usage on L42) javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i ) { var activeElement, $radio, switchers = [], container = this, radioName = 'switcher-' + i; $.each( this.children, function () { var switcher = this, $labelContainer = $( switcher.querySelector('.switcher-label') ), $labelText = $labelContainer.contents(); if ( !$labelText.length ) { return; } switchers.push( switcher ); $radio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( activeElement ).hide(); $( switcher ).show(); activeElement = switcher; } ); if ( !activeElement ) { // Mark the first one as selected activeElement = switcher; $radio.prop( 'checked', true ); } else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, $labelText ).appendTo( container ); $labelContainer.remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input type="radio">' ).attr( 'name', radioName ).click( function () { $( switchers ).show(); activeElement = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); 28f5912d496c37c7e6d654fdb5d6b17a5ec9f7ef Module:Infobox 828 10 361 360 2021-03-31T19:24:48Z wikipedia>Izno 0 add using-infobox tstyles support Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() return loadTemplateStyles() .. tostring(root) end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 78a5aca30653178a57174938c358e88ef9255cba 362 361 2021-07-12T21:56:48Z wikipedia>Frietjes 0 fix for {{infobox}} with no input args generating an empty <table class="infobox"></table> per talk page Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 8da3d8cb2583739d63030681ca84df90700981fa 363 362 2021-09-08T18:11:29Z wikipedia>Izno 0 nix Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() structure_infobox_common() return loadTemplateStyles() .. root else root = mw.html.create() root :wikitext(args.title) structure_infobox_common() return root end end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p cacf59e53cc05226138f0cde98581bce4c5ebd3e 364 363 2021-09-29T14:05:49Z wikipedia>Frietjes 0 (1) return templatestyles when child=yes, (2) move templatestyles and categories before </tr> to avoid creating empty cells (see thread on talk page) Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p b086587ea937a4bbe2742d4694689ee3980d3891 Module:Italic title 828 6 182 181 2021-06-17T18:42:51Z wikipedia>Gonnym 0 added support for string= in italic dab; fixed edge cases where module failed. All changes tested at [[Module talk:Italic title/testcases]]. Ping if you encounter an issue Scribunto text/plain -- This module implements {{italic title}}. require('Module:No globals') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) (%b())$' ) end if parentheses then parentheses = parentheses:sub(2, -2) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then local originalString if titleParts.dab then originalString = self.dab else originalString = self.title end for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = originalString:gsub( pattern, italicize ) if titleParts.dab then titleParts.dab = italicizedTitle else titleParts.title = italicizedTitle end -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) local italicTitle = ItalicTitle.new() if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('dab') end return italicTitle:render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p b26f1391f2a7f95cdb01ac06b761f418d7ad9854 183 182 2021-06-25T12:53:34Z wikipedia>Mr. Stradivarius 0 Undid revision 1029073259 by [[Special:Contributions/Gonnym|Gonnym]] ([[User talk:Gonnym|talk]]) undo for now, as this breaks [[Template:Italic title]] transclusions that 1) have a dab, 2) use the "string" argument, and 3) don't use the "all" argument Scribunto text/plain -- This module implements {{italic title}}. require('Module:No globals') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) %(([^%(%)]+)%)$' ) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then titleParts.title = self.title for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = titleParts.title:gsub( pattern, italicize ) titleParts.title = italicizedTitle -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) return ItalicTitle.new() :italicize('dab') :render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p 8c5cb60620fbf423b53f2a170efe7b2380a31c08 Module:Message box/ambox.css 828 27 875 874 2021-07-31T13:51:52Z wikipedia>Izno 0 T200206 sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Take into account templatestyles between two amboxes */ /* remove link version when T200206 is fixed */ table.ambox + link + link + table.ambox, table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* Style for compact ambox, as used inside multiple issues etc. */ /* Hide the images */ .compact-ambox table .mbox-image, .compact-ambox table .mbox-imageright, .compact-ambox table .mbox-empty-cell { display: none; } /* Remove borders, backgrounds, padding, etc. */ .compact-ambox table.ambox { border: none; border-collapse: collapse; background-color: transparent; margin: 0 0 0 1.6em !important; padding: 0 !important; width: auto; display: block; } .compact-ambox table.mbox-small-left.mbox-small-left { font-size: 100%; width: auto; margin: 0; } /* Style the text cell as a list item and remove its padding */ .compact-ambox table .mbox-text { padding: 0 !important; margin: 0 !important; } .compact-ambox table .mbox-text-span { display: list-item; line-height: 1.5em; list-style-type: square; /*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/ } .skin-vector .compact-ambox table .mbox-text-span { list-style-type: disc; /*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/ } /* Allow for hiding text in compact form */ .compact-ambox .hide-when-compact { display: none; } 4471341b0ff92aa82eea33ee2c59a41add481cc5 Template:Hlist/styles.css 10 13 603 602 2021-10-01T00:10:01Z wikipedia>IznoPublic 0 conventions sanitized-css text/css .hlist ul, .hlist ol { padding-left: 0; } /* reset hlist margins of Minerva */ .hlist li, .hlist dd, .hlist dt { margin-right: 0; } .hlist li:after, .hlist dd:after { content: " · "; font-weight: bold; } .hlist dt:after { content: ": "; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ") "; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) " "; white-space: nowrap; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) " "; } 58733fc89d6f1303f8465f89816ba815de67c7b8 604 603 2021-10-01T00:10:20Z wikipedia>IznoPublic 0 and there sanitized-css text/css .hlist ul, .hlist ol { padding-left: 0; } /* reset hlist margins of Minerva */ .hlist li, .hlist dd, .hlist dt { margin-right: 0; } .hlist li:after, .hlist dd:after { content: " · "; font-weight: bold; } .hlist dt:after { content: ": "; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ") "; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) " "; white-space: nowrap; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) " "; } a3c8fd165b35179adc94459b57d8a2249ebffcfa 605 604 2021-10-01T12:31:26Z wikipedia>IznoPublic 0 merge from common.css sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /** * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { margin: 0; /* don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again */ display: inline; } /* Display nested lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } .hlist ul, .hlist ol { padding-left: 0; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } 3a9716f40e9a8b5ce2db85815e4eb47bf357e01c 606 605 2021-10-03T22:47:43Z wikipedia>Izno 0 adjust note sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /** * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display nested lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } .hlist ul, .hlist ol { padding-left: 0; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } bbd72a92d22f6c2ae55137cc2f64d774de9c44af Module:TableTools 828 7 234 233 2021-10-04T10:40:18Z wikipedia>MSGJ 0 improved module formatting; improved isArray; added isArrayLike; fixed _deepCopy; and improved defaultKeySort, code by [[User:Alexiscoutinho]] Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and tostring(v) == '-nan' end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(t) checkType('removeDuplicates', 1, t, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(t) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local map = {} for i, v in ipairs(arr) do map[v] = i end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. ------------------------------------------------------------------------------------ function p.listToSet(t) checkType("listToSet", 1, t, "table") local set = {} for _, item in ipairs(t) do set[item] = true end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = _deepCopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if valueToFind is a member of the array, and false otherwise. ------------------------------------------------------------------------------------ function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 47aa1c05bdd7949be185240efb1b9222652d2fef 235 234 2022-01-31T13:08:18Z wikipedia>MSGJ 0 updates/fixes requested by [[User:Uzume]] Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = _deepCopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if valueToFind is a member of the array, and false otherwise. ------------------------------------------------------------------------------------ function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 085e7094ac84eb0132ee65822cf3f69cd8ba3d81 Module:Infobox/styles.css 828 12 596 2021-10-07T01:11:29Z wikipedia>Izno 0 move subbox and new 3cols version to templatestyles as the beginning of the end for infobox styles (still have to clean up all the infobox uses in the wild sanitized-css text/css /* {{pp|small=y}} */ /* not strictly certain these styles are necessary * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } 674b846cd2f674251c2b99a06ad2cf06393c38b7 597 596 2021-10-07T01:12:13Z wikipedia>Izno 0 Protected "[[Module:Infobox/styles.css]]": match parent ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) sanitized-css text/css /* {{pp|small=y}} */ /* not strictly certain these styles are necessary * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } 674b846cd2f674251c2b99a06ad2cf06393c38b7 598 597 2021-10-07T01:18:14Z wikipedia>Izno 0 add a stronger note sanitized-css text/css /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } 4e60b3cfbf50d1fd637f4a5af11a460a6569e988 599 598 2022-01-03T23:12:04Z wikipedia>Izno 0 move navbar styling here sanitized-css text/css /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } .infobox .navbar { font-size: 100%; } 059faa215ace386eb0e16526c7514be34ded4bb7 600 599 2022-01-18T15:18:00Z wikipedia>Jdlrobson 0 Fix [[phab:T281642]], a pet peeve of mine. This copies across styles from [[MediaWiki:Minerva.css]] sanitized-css text/css /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } .infobox .navbar { font-size: 100%; } /* T281642 */ body.skin-minerva .infobox-header, body.skin-minerva .infobox-subheader, body.skin-minerva .infobox-above, body.skin-minerva .infobox-title, body.skin-minerva .infobox-image, body.skin-minerva .infobox-full-data, body.skin-minerva .infobox-below { text-align: center; } e8de6d96f4fde53afc4a6b0fed534405ab59b0a7 Module:Infobox 828 10 365 364 2021-10-07T14:44:35Z wikipedia>Izno 0 move subbox to templatestyles, still working on the other 4k. will remove from common.css Soon Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 6eeb311b3ac96c0ebe6c032fef6d60a795c1e65e 366 365 2021-10-08T12:17:23Z wikipedia>Neveselbert 0 Reverted [[WP:AGF|good faith]] edits by [[Special:Contributions/Izno|Izno]] ([[User talk:Izno|talk]]): This edit appears to cause extraordinarily high spaces between lines on [[Template:Infobox officeholder]]. Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p b086587ea937a4bbe2742d4694689ee3980d3891 367 366 2021-10-10T17:00:17Z wikipedia>Plastikspork 0 Fix templatestyles pattern, this tag will be expanded into a strip-marker when processed here Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: load base templatestyles here rather than in MediaWiki:Common.css We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description -- local base_templatestyles = frame:extensionTag{ -- name = 'templatestyles', args = { src = cfg.i18n.templatestyles } -- } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 436a1819ca69ecd6e959b531d9962727a3d9befe 368 367 2021-10-11T22:21:33Z wikipedia>Izno 0 uno mas, based on plastikspork's work Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p a462d1c2f66def26027b24ffe0958a5584a3f216 369 368 2021-10-11T22:22:54Z wikipedia>Izno 0 ocd triggered Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles which use infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p c38bb7c8249049bbfd594fa42a9aca6b5b9b8ded 370 369 2021-11-16T10:21:29Z wikipedia>Fayenatic london 0 update category link Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages which use embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 489656e9a7ca541897ed218059d583b7953a7a7c 371 370 2021-11-16T10:26:17Z wikipedia>Fayenatic london 0 update category link Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages which use infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p c874e4449c7589d3a5c460043c63a54c5cb1144f 372 371 2021-11-16T10:29:12Z wikipedia>Fayenatic london 0 update category link Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 75a6506009c7e1c0fab00c670ebe89010c99e49f 373 372 2021-11-16T10:29:48Z wikipedia>Fayenatic london 0 spacing Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub( category_in_empty_row_pattern, '' ):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 05a758c4532f643205b2300a5935f5d4ef3fc721 Template:Ambox 10 18 751 750 2021-10-28T18:27:47Z wikipedia>GKFX 0 Copy fix from sandbox; only articles should go in this category. wikitext text/x-wiki {{#invoke:Message box|ambox}}{{#ifeq:{{{small}}};{{NAMESPACENUMBER}}|left;0|[[Category:Articles using small message boxes]]}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 0c13ec156138ae0499c998cc3d7fbbeac4aeeed6 Module:Navbar/styles.css 828 15 648 647 2021-11-12T21:48:35Z wikipedia>Dinoguy1000 0 move text-decoration:inherit to TemplateStyles sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .navbar a > abbr { text-decoration: inherit; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } /* Navbar styling when nested in infobox and navbox Should consider having a separate TemplateStyles for those specific places using an infobox/navbox and a navbar, or possibly override from using template */ .infobox .navbar { font-size: 100%; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } 8fac6fe5b897a77784d8a19001d46b0cc3765673 649 648 2022-01-03T23:12:15Z wikipedia>Izno 0 navbar styles that were moved to parent templates sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .navbar a > abbr { text-decoration: inherit; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } 9d4056f949b4f0b159e3d40dfb1a5f01e72f9571 Module:Navbar 828 8 271 270 2021-11-12T21:48:57Z wikipedia>Dinoguy1000 0 move text-decoration:inherit to TemplateStyles Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end font_style = (font_style or '') local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p a4c8811868c057c8a634ad9a98e7032c227227bf 272 271 2021-11-13T05:33:43Z wikipedia>Izno 0 remove unnecessary line Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p a5c8d3a8f8beb18984ea7f145ddbdf88a065d23e Module:Navbar/configuration 828 9 290 289 2021-11-13T05:39:10Z wikipedia>Izno 0 well, since I edited the other one... Scribunto text/plain return { ['templatestyles'] = 'Module:Navbar/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } bbf3d86b48a5b40835e8e232ae9821e6bca390ec Template:Hlist/styles.css 10 13 607 606 2021-12-05T15:26:24Z wikipedia>IznoPublic 0 two separate things going on here sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /** * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } .hlist ul, .hlist ol { padding-left: 0; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } d086ee2fb38620aab66da145a75a6e9384f5b00e 608 607 2022-01-23T20:22:18Z wikipedia>IznoPublic 0 duplicates padding above, ws sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /** * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } c3137d9eecfaa49c666dda48be4ba683104e0a9b Module:Message box/configuration 828 5 157 156 2022-03-02T15:03:44Z wikipedia>Xaosflux 0 small tag, requested on talk Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, imageEmptyCellStyle = true, templateCategory = 'Talk message boxes' } } e680fc427fcb0ec71939a005ef791dfebc4ba735 158 157 2022-07-11T18:19:26Z wikipedia>Izno 0 add templatestyles, remove a variable or two as a result Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>', templatestyles = 'Module:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'Module:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'Module:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg' }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes', templatestyles = 'Module:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'Module:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'Talk message boxes', templatestyles = 'Module:Message box/tmbox.css' } } b6f0151037e6867b577c8cca32ff297e48697a10 MediaWiki:Gadget-switcher.js 8 38 1091 1090 2022-04-06T14:36:06Z wikipedia>Krinkle 0 Maintenance: Even more minor optimisations, tested on [[Template:Switcher/testcases]] and [[Broadway Hollywood Building]] with safemode=1 javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) { var selected, $radio; var switchers = [] var radioName = 'switcher-' + i; $.each( container.children, function ( j, switcher ) { var label = switcher.querySelector( '.switcher-label' ); if ( !label || !label.childNodes.length ) { return; } switchers.push( switcher ); $radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( selected ).hide(); $( switcher ).show(); selected = switcher; } ); if ( !selected ) { // Mark the first one as selected selected = switcher; $radio.prop( 'checked', true ); } else if ( label.getAttribute( 'data-switcher-default' ) !== null ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container ); $( label ).remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( switchers ).show(); selected = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); 762811537a90373de140d64f5c79f59d8dc605a6 Module:Message box/ambox.css 828 27 876 875 2022-05-07T18:24:08Z wikipedia>Izno 0 Izno moved page [[Template:Ambox/styles.css]] to [[Module:Message box/ambox.css]] without leaving a redirect: standardize location sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Take into account templatestyles between two amboxes */ /* remove link version when T200206 is fixed */ table.ambox + link + link + table.ambox, table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* Style for compact ambox, as used inside multiple issues etc. */ /* Hide the images */ .compact-ambox table .mbox-image, .compact-ambox table .mbox-imageright, .compact-ambox table .mbox-empty-cell { display: none; } /* Remove borders, backgrounds, padding, etc. */ .compact-ambox table.ambox { border: none; border-collapse: collapse; background-color: transparent; margin: 0 0 0 1.6em !important; padding: 0 !important; width: auto; display: block; } .compact-ambox table.mbox-small-left.mbox-small-left { font-size: 100%; width: auto; margin: 0; } /* Style the text cell as a list item and remove its padding */ .compact-ambox table .mbox-text { padding: 0 !important; margin: 0 !important; } .compact-ambox table .mbox-text-span { display: list-item; line-height: 1.5em; list-style-type: square; /*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/ } .skin-vector .compact-ambox table .mbox-text-span { list-style-type: disc; /*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/ } /* Allow for hiding text in compact form */ .compact-ambox .hide-when-compact { display: none; } 4471341b0ff92aa82eea33ee2c59a41add481cc5 877 876 2022-05-07T18:26:18Z wikipedia>Izno 0 remove compact-ambox sanitized-css text/css /* Article message box styles */ table.ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Take into account templatestyles between two amboxes */ /* remove link version when T200206 is fixed */ table.ambox + link + link + table.ambox, table.ambox + table.ambox { /* Single border between stacked boxes. */ margin-top: -1px; } .ambox th.mbox-text, .ambox td.mbox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ } .ambox td.mbox-image { /* The left image cell */ /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ } .ambox td.mbox-imageright { /* The right image cell */ /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ } table.ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } table.ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } table.ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } table.ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } table.ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } table.ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } table.ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } c96b85b00333b1617182538bd4ecd8539794ad56 878 877 2022-05-07T22:28:30Z wikipedia>Izno 0 optimize for one sheet version of .mbox-text and etc. sanitized-css text/css /* Article message box styles */ .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. */ .ambox + link + .ambox, .ambox + link + link + .ambox, .ambox + link + style + .ambox, /* TODO: raise as "is this really that necessary???" */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox { margin-top: -1px; } .ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* High specificity due to .ambox + .ambox above */ html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; box-sizing: border-box; width: 238px; font-size: 88%; line-height: 1.25em; } html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; box-sizing: border-box; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } d47aa006b06f9ca03b5ae5741251a05d400800fe 879 878 2022-05-07T22:38:20Z wikipedia>Izno 0 a little more rationale sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. */ /* Take into account base templatestyles, user styles, and * {{dated maintenance category}} */ /* remove versions with link only, when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } .ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* High specificity due to .ambox + .ambox above */ html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; box-sizing: border-box; width: 238px; font-size: 88%; line-height: 1.25em; } html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; box-sizing: border-box; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } fa2aadf133ca49b58765bf261ade386a28cfa4db 880 879 2022-05-07T22:39:32Z wikipedia>Izno 0 adj note sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove versions with link only, when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } .ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* High specificity due to .ambox + .ambox above */ html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; box-sizing: border-box; width: 238px; font-size: 88%; line-height: 1.25em; } html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; box-sizing: border-box; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } b270b91c8b8d493d986ac47f7f5707f5a848dee6 881 880 2022-05-07T22:44:00Z wikipedia>Izno 0 make this what I meant originally sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } .ambox-notice { /* @noflip */ border-left: 10px solid #36c; /* Blue */ } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* High specificity due to .ambox + .ambox above */ html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; box-sizing: border-box; width: 238px; font-size: 88%; line-height: 1.25em; } html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; box-sizing: border-box; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } dd35c783f2600de9fd6cca32f4e9bbca5d248492 882 881 2022-05-07T22:44:34Z wikipedia>Izno 0 remove .ambox-notice since it's the default sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } /* High specificity due to .ambox + .ambox above */ html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */ /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; box-sizing: border-box; width: 238px; font-size: 88%; line-height: 1.25em; } html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; box-sizing: border-box; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } 40a6cf5818efc9e50030af5999399fe189f8d3be 883 882 2022-05-08T00:23:30Z wikipedia>Izno 0 remove duplicate css in .mbox-small-left, remove .mbox-small since ambox doesn't use it sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */ /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { /* The left image cell */ border: none; /* @noflip */ padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */ text-align: center; } .ambox .mbox-imageright { /* The right image cell */ border: none; /* @noflip */ padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */ text-align: center; } .ambox .mbox-empty-cell { /* An empty narrow cell */ border: none; padding: 0; width: 1px; } 239fb9473cdcaaa5a16c746af60daf497ec71250 884 883 2022-05-08T00:27:40Z wikipedia>Izno 0 comment adjustment/removals sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } fc9b6b33d54015a94e71e2cc0e1130d07fe186a8 885 884 2022-07-07T20:14:05Z wikipedia>Izno 0 Protected "[[Module:Message box/ambox.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) sanitized-css text/css .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } fc9b6b33d54015a94e71e2cc0e1130d07fe186a8 886 885 2022-07-07T20:14:19Z wikipedia>Izno 0 match parent sanitized-css text/css /* {{pp|small=y}} */ .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } 64ac7a8e3c085f54a535a3b8463d43f303cc9a58 887 886 2022-07-07T20:29:11Z wikipedia>Izno 0 move the margin setting to a media block sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } @media (min-width: 550px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } 71e0e43f9586c8f7e3593679d55f5c01799932e8 888 887 2022-07-07T20:35:59Z wikipedia>Izno 0 use standard 720px which is a convenient balance with what responsive.css gadgets are doing and what monobook.css is doing sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } @media (min-width: 720px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } 7ac271f217779bef136333a863be96848edc2072 889 888 2022-07-09T18:36:17Z wikipedia>Izno 0 add image-div sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ambox .mbox-image-div { width: 52px; } @media (min-width: 720px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } ecb9974f89ab2b5d760548cd12d031c79e70e8bb 890 889 2022-07-12T15:25:07Z wikipedia>Izno 0 hack around mf being opinionated sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ambox .mbox-image-div { width: 52px; } /* Hack around MobileFrontend being opinionated */ html.client-js body.skin-minerva .mbox-text-span { margin-left: 23px !important; } @media (min-width: 720px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } 29898fdc5160b39a8f580c76efe77afa1f6f58a4 Module:Message box 828 4 123 122 2022-05-07T20:10:16Z wikipedia>Izno 0 support templatestyles Scribunto text/plain -- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. -- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno') -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage() -- Define constants local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'>''(<span class='date'>%s</span>)''</span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell if cfg.imageEmptyCellStyle then self.imageEmptyCellStyle = 'border:none;padding:0;width:1px' end -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places -- TODO: Add each template's stylesheet, waiting on [[MediaWiki talk:Common.css/to do]] local frame = mw.getCurrentFrame() -- we'll need this unconditionally for the TODO if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') :cssText(self.imageEmptyCellStyle or nil) end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :css('text-align', 'center') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) b6481f9044d5251ca5426b6984edd8909b56594c 124 123 2022-07-11T18:19:29Z wikipedia>Izno 0 add templatestyles, remove a variable or two as a result Scribunto text/plain require('Module:No globals') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) fd6a8b1a0ac5916465cdf2eb099825f1d006cfba 125 124 2022-10-23T04:26:44Z wikipedia>Legoktm 0 Replace [[Module:No globals]] with require( "strict" ) Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) bdb0ecc9f26f26b9c0ce12a066a183ac9d4f0705 Module:Italic title 828 6 184 183 2022-10-21T21:17:12Z wikipedia>Legoktm 0 Replace [[Module:No globals]] with require( "strict" ) Scribunto text/plain -- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) %(([^%(%)]+)%)$' ) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then titleParts.title = self.title for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = titleParts.title:gsub( pattern, italicize ) titleParts.title = italicizedTitle -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) return ItalicTitle.new() :italicize('dab') :render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p 9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8 Template:Plainlist/styles.css 10 14 621 2022-12-11T05:30:13Z wikipedia>Izno 0 get this onto its own page to start sanitized-css text/css .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 1fbd9ccb7b6925a181cdfa3c5697dc71894ec3b1 622 621 2022-12-11T05:31:07Z wikipedia>Izno 0 Protected "[[Template:Plainlist/styles.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) sanitized-css text/css .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 1fbd9ccb7b6925a181cdfa3c5697dc71894ec3b1 623 622 2022-12-11T05:31:07Z wikipedia>Izno 0 Adding {{pp-template}} sanitized-css text/css /* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 710f88efa99a90eb635aaa28444a2116b7cca527 624 623 2022-12-11T05:31:19Z wikipedia>Izno 0 meh sanitized-css text/css /* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 859c2ffcd10c0d835602c37fa7a958534c432c0a Template:Plainlist/styles.css 10 14 625 624 2022-12-11T06:59:53Z wikipedia>Izno 0 add this reset from mobile.css sanitized-css text/css /* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 51706efa229ff8794c0d94f260a208e7c5e6ec30 Module:Infobox 828 10 374 373 2022-12-20T20:41:06Z wikipedia>Izno 0 support finding plainlist in infobox class fields Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' } -- TODO: hlist_t goes here when ready to be TStyled, plus relevant -- implementations below } local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass }) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class }) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true has_list_class({ args.aboveclass }) root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true has_list_class({ args.belowclass }) root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ subheaderArgs.rowclass, subheaderArgs.class }) local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ imageArgs.rowclass, imageArgs.class }) local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(require('Module:Italic title')._main({})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end return table.concat({ base_templatestyles, -- see function description templatestyles, child_templatestyles, grandchild_templatestyles, plainlist_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) has_list_class({ args.bodyclass }) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p c6b4106f9984588d02d0a10801162d59fdc29c6f 375 374 2022-12-27T21:29:12Z wikipedia>Izno 0 merge hlist here Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' }, hlist_t = { patterns = { '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found = false, styles = 'Hlist/styles.css' } } local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass }) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class }) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true has_list_class({ args.aboveclass }) root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true has_list_class({ args.belowclass }) root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ subheaderArgs.rowclass, subheaderArgs.class }) local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ imageArgs.rowclass, imageArgs.class }) local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(require('Module:Italic title')._main({})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() local hlist_templatestyles = '' if lists.hlist_t.found then hlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.hlist_t.styles } } end local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because the rows of interest invoking -- each class may not be on a specific page hlist_templatestyles, plainlist_templatestyles, base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) has_list_class({ args.bodyclass }) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 0ddb7e5c8426d67cd589b710efb9912ddfb67fea Template:Hlist/styles.css 10 13 609 608 2022-12-25T22:29:36Z wikipedia>Izno 0 add TODO for :is() sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /** * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ /* TODO: When the majority of browsers support it, use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } e1f6ed2d34048f6679b9b7f6be2513acfac61da7 610 609 2022-12-25T22:32:31Z wikipedia>Izno 0 adj note sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @author [[User:Edokter]] */ /* * Note hlist style usage differs in Minerva and is defined in core as well! * Please check Minerva desktop (and Minerva.css) when changing * See https://phabricator.wikimedia.org/T213239 * TODO: Remove this note when it becomes irrelevant. (Soon?) */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } 2d02b82390df628ce4250cee2732347e7ab99dc6 611 610 2022-12-25T23:15:32Z wikipedia>Izno 0 remove sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* Generate interpuncts */ .hlist dt:after { content: ": "; } .hlist dd:after, .hlist li:after { content: " · "; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: " ("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li:before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child:before, .hlist dt ol > li:first-child:before, .hlist li ol > li:first-child:before { content: " (" counter(listitem) "\a0"; } 259585ebb776c8815f72209cabdfbe0fa6335d6e 612 611 2022-12-25T23:25:45Z wikipedia>Izno 0 use actual pseudo-element selectors for after and before, all grade C and up support double (correct number) of colons sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: believe :not() can be used here to remove the later rule. needs testing. * like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist dd:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 512a420a8664b55e27f53dfe939533ba520435d2 613 612 2022-12-25T23:33:03Z wikipedia>Izno 0 li sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: believe :not() can be used here to remove the later rule. needs testing. * like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 749523cecceae3e4fdf4f328a2c95044c4c2ff99 614 613 2022-12-25T23:36:32Z wikipedia>Izno 0 naive works sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can be used here to remove the later rule. mor testing needed * naive test seems to work. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 6300dfac4a6854ee857b5cd558ec3da0b511a34e 615 614 2022-12-25T23:37:25Z wikipedia>Izno 0 one final adjustment sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } b51fc7c671c5df7999abaae85dcb863fe3202674 616 615 2022-12-26T00:09:37Z wikipedia>Izno 0 Protected "[[Template:Hlist/styles.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) sanitized-css text/css /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } b51fc7c671c5df7999abaae85dcb863fe3202674 617 616 2022-12-26T00:09:37Z wikipedia>Izno 0 Adding {{pp-protected}} sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 7ed02020aef7e9b95746f149dca4e44f55b5ae6d 618 617 2022-12-26T17:54:30Z wikipedia>Izno 0 re-add this note on reflection sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* Style for horizontal lists (separator following item). @source mediawiki.org/wiki/Snippets/Horizontal_lists @revision 8 (2016-05-21) @original-author [[User:Edokter]] */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } ca71d763ccce7df9f41568e0f64455b6290de4a2 619 618 2022-12-26T18:00:17Z wikipedia>Izno 0 actually remove that block, someone can dig for authorship sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 8c9dd9c9c00f30eead17fe10f51d183333e81f33 Module:Navbar/configuration 828 9 291 290 2022-12-29T18:18:21Z wikipedia>Izno 0 add hlist/styles.css Scribunto text/plain return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Hlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } b007c336b17ec4bcd4d5a9dca9f8cba301662b55 Module:Navbar 828 8 273 272 2022-12-29T18:20:02Z wikipedia>Izno 0 add templatestyles for hlist Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p 79f907e59eaa8bbf8dd50bb751933ebeaaa7eb17 Vs HeartStone Destiny 0 35 1020 2023-06-27T20:15:29Z JsfasdF256 2 Created page with "{{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director= |codirector= |creator= |charter= |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine= |theme= |gamegenre= }} Cqmics Funkin ==Characters== ===Alex=== {{Character |name=Alex |image= |..." wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director= |codirector= |creator= |charter= |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine= |theme= |gamegenre= }} Cqmics Funkin ==Characters== ===Alex=== {{Character |name=Alex |image= |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ===Noah=== ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} e9afcc0e3a12fa44c8922750b15089b8160d37d7 1021 1020 2023-06-27T20:16:55Z JsfasdF256 2 wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== ===Alex=== {{Character |name=Alex |image= |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ===Noah=== ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} 9812f44fe022edfe683c2175de494b346bbf32f2 1022 1021 2023-06-27T20:48:34Z fandom:fridaynightfunking>Rickhenrique 0 I recommend using tabbers later if plan on doing that wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image= |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} {{!}}-{{!}}Noah= ===Noah=== }} ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} 8f8846798bad3069813bdb8c2a2b14b23e26d9bd 1023 1022 2023-06-27T20:52:04Z JsfasdF256 2 /* Characters */ Alex wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== }} ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} 1f2f43ca52bc4e33d7f3805851ecb7948fe52e23 1024 1023 2023-06-27T21:12:32Z JsfasdF256 2 /* Characters */ wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== }} ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} d354c0d00d53d04c8640256cbcabd89063024e78 1025 1024 2023-06-27T22:00:33Z JsfasdF256 2 /* Characters */ Noah wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} 51e47554903deb5bff3d441ca7f6f12c4851a125 1026 1025 2023-06-27T22:14:56Z JsfasdF256 2 /* Characters */ Boyfriend wikitext text/x-wiki {{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== ==Download== *{{GameBanana|mods/447472}} bdef5017c8c93ad69c057057f23c9f91e5ab03bc 1027 1026 2023-06-27T22:22:46Z JsfasdF256 2 logo wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 2d639d4c86b8e38f90a07b0102724971ebfe3bfd 1028 1027 2023-06-27T22:43:18Z JsfasdF256 2 /* Characters */ Bray wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 4cadb2ba973e0b7ded45e2352a53b76d24b5cec6 1029 1028 2023-06-27T23:00:10Z JsfasdF256 2 /* Characters */ Carlos wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} b49b8e57ab4aa677aba66418fa040d8155cb3092 1030 1029 2023-06-27T23:02:27Z JsfasdF256 2 wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 654f55811f2318c620503a153c644c54a194a674 1031 1030 2023-06-27T23:10:21Z JsfasdF256 2 /* Characters */ Chaz wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 5f79c36f1cacb1fd57ef2bdd281584937ebe10d0 1032 1031 2023-06-27T23:18:02Z JsfasdF256 2 /* Characters */ Wrath wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 04c875cd13a8810caabf4b9def1c873cc4b95b87 1033 1032 2023-06-27T23:30:26Z JsfasdF256 2 /* Characters */ Charles wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} b5f9841b558a724feda540e4cfe6597a5811f3b2 1034 1033 2023-06-27T23:39:29Z JsfasdF256 2 /* Characters */ Pluto wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 41c71771ce6ca5ce717c546ec445bbdc5e3142d1 1035 1034 2023-06-27T23:56:16Z JsfasdF256 2 /* Characters */ Vibe King wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=vibeking idle.gif }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 1954f01a5785a023394feed9838f3d22ec0b975b 1036 1035 2023-06-28T00:10:59Z JsfasdF256 2 Bumpo wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=alexcqmics idle.gif |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=vibeking idle.gif }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 0d7b222068b4698d3fae6ceeab8ec64be75d1604 1037 1036 2023-06-28T01:41:24Z JsfasdF256 2 /* Characters */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=vibeking idle.gif }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 477c6989430a12e86725d6c813cf61459bfac7b6 1038 1037 2023-06-28T23:20:26Z JsfasdF256 2 /* Characters */ Vibe King and Skelly wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 257b7c2381a19a229e960f553a9e02523feb5d80 1039 1038 2023-07-21T21:15:23Z JsfasdF256 2 /* Music */ Bearrito wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} e72c0fd440049d8885a6ced04f89d3f2ec5b654f 1040 1039 2023-07-21T21:30:14Z JsfasdF256 2 /* Music */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} |-|Covers= </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} a35fc1da96809623befe39168b1d9e8aa88e9e0d 1041 1040 2023-07-21T22:04:20Z JsfasdF256 2 /* Music */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} b60f6ba99043a9f68e57fa4eacef54691de89297 1042 1041 2023-07-21T22:15:46Z JsfasdF256 2 /* Characters */ Noah game over wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons= |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 5db908e0fd213749e40ee49f687c2fb030626790 1043 1042 2023-07-21T23:29:18Z JsfasdF256 2 /* Characters */ icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=noahcqmics idle.gif |icons=noahcqmics icons.png }} <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} ea3301bb97d7eedfb4c510deac10fff2c55856e6 1044 1043 2023-07-23T21:50:31Z JsfasdF256 2 /* Characters */ Noah in Z hoodie wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 4d07e506ea52d7c3be82e243cfd50a10125aaf2d 1045 1044 2023-07-23T22:24:09Z JsfasdF256 2 /* Characters */ Kana wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 73792484830bc5956c8007d5b859383557840802 1046 1045 2023-07-23T22:36:17Z JsfasdF256 2 /* Characters */ HH4 Noah wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 4fe1a2b94caad96138c944e369d9e9604d786385 1047 1046 2023-07-23T22:44:13Z JsfasdF256 2 /* Characters */ Gray Noah wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 640cfc505a028f6d3b90e9413a3f9ff430609661 1048 1047 2023-07-23T23:13:25Z JsfasdF256 2 /* Characters */ Larry wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose </gallery> |-|Normal= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 4f47ce5ec9a435b91b007142f32f9c2e32612dd6 1049 1048 2023-07-23T23:17:15Z JsfasdF256 2 /* Characters */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} ef10d11920808941dfa984a10848d1df9b9ef877 1050 1049 2023-07-23T23:47:38Z JsfasdF256 2 /* Characters */ Larry icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> =====Sword===== <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 72c139c944867b408f621ef6b017893cf4a0a992 1051 1050 2023-07-24T20:04:17Z JsfasdF256 2 /* Characters */ White Alex wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> </gallery> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 760e6828bf41af9b25892ee1cd180661aaa5d304 1052 1051 2023-07-24T20:04:55Z JsfasdF256 2 /* Characters */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=Chazcqmics idle.gif }} <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} b9ff37caeed72bddf937e9749ea1605264ad1308 1053 1052 2023-07-24T20:21:06Z JsfasdF256 2 /* Characters */ White Chaz wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} ac6c3c71e3ac6cd044c791e7202ca878c7e3e337 Vs HeartStone Destiny 0 35 1054 1053 2023-07-24T20:48:54Z JsfasdF256 2 /* Characters */ Game Over Alex wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 8c5a527d1cca47ba02075ca996a48aaf89c020d9 1055 1054 2023-07-24T22:11:38Z JsfasdF256 2 /* Characters */ BF game over wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 56cd6fbb0686a5e2b2b2a3933970bc977eaf8c3c 1056 1055 2023-07-24T22:18:37Z JsfasdF256 2 /* Characters */ White Noah wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8 1058 1056 2023-07-31T23:59:50Z JsfasdF256 2 /* Characters */ Skelly icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 07f16918b8296c98a5c0c261547f95af95dbe7bf 1059 1058 2023-08-01T21:42:44Z JsfasdF256 2 /* Characters */ Alex wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} e3cbed48e0aa266f6bbbe4c3c10c266529274fe5 1060 1059 2023-08-01T21:52:47Z JsfasdF256 2 /* Characters */ Bumpo wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 69a9b6c8e7e481679749a6313c4628d6d1e0b253 1061 1060 2023-08-01T22:11:44Z JsfasdF256 2 /* Characters */ BF wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} e76db65a20e5bb82de7bfbd9734e05aaebb7d3f5 1062 1061 2023-08-01T22:18:48Z JsfasdF256 2 /* Characters */ Noah icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 53569c1b96cf7fa62e4800ddb18b7f71725fc49e 1063 1062 2023-08-01T23:04:40Z JsfasdF256 2 /* Characters */ Spritesheet wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 35ee0cbcb13929fc32114dc1ccbdb06f68a55dac 1064 1063 2023-08-01T23:14:30Z JsfasdF256 2 /* Characters */ New Skelly Icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 0519d954f152c9488be208dd0d1677fe7ba8c273 1065 1064 2023-08-01T23:43:43Z JsfasdF256 2 /* Characters */ Spritesheets wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 sheet.png </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 174a3ae5e98345bfee8e48197ce1fb8117014bc5 1066 1065 2023-08-05T21:50:01Z JsfasdF256 2 /* Characters */ New Larry wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 sheet.png </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 78897537e819136cbf449ef1494fdf2ff0818e63 1067 1066 2023-08-06T07:43:58Z JsfasdF256 2 /* Characters */ Add missing alex poses wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 sheet.png </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 0c3c951d0aea444f999f67784f4a779b4dfa8138 1068 1067 2023-08-06T07:54:49Z JsfasdF256 2 /* Characters */ New Noah wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} bab9372965d7f802ebf5d358a3f5d2a8f6686f71 1069 1068 2023-08-06T18:04:48Z JsfasdF256 2 /* Characters */ Mad Larry wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 967bf9f874d04c90983806e282c45e0b991977a9 1070 1069 2023-08-06T18:16:39Z JsfasdF256 2 /* Characters */ wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 2396b8e2c30a62ae21dbab05c3fd38f541adb774 1071 1070 2023-08-06T18:29:17Z JsfasdF256 2 /* Characters */ Chaz wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 5d0016a0914d0d3a5de79c5916dc3e188330f141 1072 1071 2023-08-06T19:04:42Z JsfasdF256 2 /* Characters */ white Chaz wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 49e8d7dadc522ff2e6f2f555850ff1769ede11ad 1073 1072 2023-08-06T20:11:26Z JsfasdF256 2 /* Characters */ Noah wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} d57ead2228cb03391e53a8cfa0c5368e3896e4b9 1074 1073 2023-08-06T21:30:54Z JsfasdF256 2 /* Characters */ Larry icons wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Icons= <gallery> larrycqmics-v4 icon.gif|Normal icon larrycqmics-v4 iconlose.gif|Danger icon larrycqmics-v4 iconwin.gif|Winning icon larrycqmics-v4 icon.png|Static normal icon larrycqmics-v4 iconlose.png|Static danger icon larrycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 9150054e793aee30c99a23d00fb86aff36af15b3 1075 1074 2023-08-09T23:01:30Z Cqmics 4 I added the link for the Comic it is based off of wikitext text/x-wiki Cqmics Funkin is a Friday Night Funkin' Mod based off of a WEBTOON titled Cqmics You can Read it here! [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 Cqmics]{{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.] __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Icons= <gallery> larrycqmics-v4 icon.gif|Normal icon larrycqmics-v4 iconlose.gif|Danger icon larrycqmics-v4 iconwin.gif|Winning icon larrycqmics-v4 icon.png|Static normal icon larrycqmics-v4 iconlose.png|Static danger icon larrycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} 41f31a0f52bf461575e23a30099967ec6bc41a5a 1076 1075 2023-08-09T23:04:57Z Cqmics 4 /* Characters */ wikitext text/x-wiki Cqmics Funkin is a Friday Night Funkin' Mod based off of a WEBTOON titled Cqmics You can Read it here! [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 Cqmics]{{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.] __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Icons= <gallery> larrycqmics-v4 icon.gif|Normal icon larrycqmics-v4 iconlose.gif|Danger icon larrycqmics-v4 iconwin.gif|Winning icon larrycqmics-v4 icon.png|Static normal icon larrycqmics-v4 iconlose.png|Static danger icon larrycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} d2e9492a943dc4dabfd84e72fa74bd31a4630080 1077 1076 2023-09-13T18:26:48Z Cqmics 4 wikitext text/x-wiki Vs HeartStone Destiny is a Friday Night Funkin' Mod based off of a WEBTOON titled HeartStone Destiny You can Read it here! [https://www.webtoons.com/en/canvas/heartstone-destiny/list?title_no=354550 HeartStone Destiny]{{ModInfo | image = Cqmics Funkin logo.gif | caption = | release = June 2nd 2023, Updated Sept 5th 2023 | projectmanager = | director = Cqmics | codirector = | creator = | charter = JordanSantiagoYT | composer = | sfx = | recorder = | artist = Cqmics | bgartist = | spriteartist = | designer = | animator = | developers = | writer = | voices = | vocals = Lepony, Xarakuma | version = 5 | programmer = | consultant = | musicconsultant = | artconsultant = | creativeconsultant = | playtester = | misc = | specialthanks = | website = | engine = [[Psych Engine]] | theme = | gamegenre = | title = Vs HeartStone Destiny | chromaticscales = Lepony, Xarakuma }} Vs Heartstone Destiny is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.] __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Icons= <gallery> larrycqmics-v4 icon.gif|Normal icon larrycqmics-v4 iconlose.gif|Danger icon larrycqmics-v4 iconwin.gif|Winning icon larrycqmics-v4 icon.png|Static normal icon larrycqmics-v4 iconlose.png|Static danger icon larrycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} ea56aceff8c895b996231a9d39b8f9e716a795dc 1078 1077 2023-10-20T00:16:23Z JsfasdF256 2 Fadyblok240 moved page [[Cqmics Funkin]] to [[Vs HeartStone Destiny]]: new name wikitext text/x-wiki Vs HeartStone Destiny is a Friday Night Funkin' Mod based off of a WEBTOON titled HeartStone Destiny You can Read it here! [https://www.webtoons.com/en/canvas/heartstone-destiny/list?title_no=354550 HeartStone Destiny]{{ModInfo | image = Cqmics Funkin logo.gif | caption = | release = June 2nd 2023, Updated Sept 5th 2023 | projectmanager = | director = Cqmics | codirector = | creator = | charter = JordanSantiagoYT | composer = | sfx = | recorder = | artist = Cqmics | bgartist = | spriteartist = | designer = | animator = | developers = | writer = | voices = | vocals = Lepony, Xarakuma | version = 5 | programmer = | consultant = | musicconsultant = | artconsultant = | creativeconsultant = | playtester = | misc = | specialthanks = | website = | engine = [[Psych Engine]] | theme = | gamegenre = | title = Vs HeartStone Destiny | chromaticscales = Lepony, Xarakuma }} Vs Heartstone Destiny is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.] __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode {{Character |name=Larry |image=<gallery> Larrycqmics-v4 idle.gif|Normal Larrycqmicsmad-v4 idle.gif|Mad Larrycqmics idle.gif|Normal (old) Larrycqmicsmad idle.gif|Mad (old) Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics-v4 idle.png|Static idle pose Larrycqmics-v4 left.gif|Left pose Larrycqmics-v4 down.gif|Down pose Larrycqmics-v4 up.gif|Up pose Larrycqmics-v4 right.gif|Right pose Larrycqmics-v4 left.png|Static left pose Larrycqmics-v4 down.png|Static down pose Larrycqmics-v4 up.png|Static up pose Larrycqmics-v4 right.png|Static right pose </gallery> |-|Mad= <gallery> Larrycqmicsmad-v4 idle.png|Static idle pose Larrycqmicsmad-v4 left.gif|Left pose Larrycqmicsmad-v4 down.gif|Down pose Larrycqmicsmad-v4 up.gif|Up pose Larrycqmicsmad-v4 right.gif|Right pose Larrycqmicsmad-v4 left.png|Static left pose Larrycqmicsmad-v4 down.png|Static down pose Larrycqmicsmad-v4 up.png|Static up pose Larrycqmicsmad-v4 right.png|Static right pose Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!" Larrycqmicsmad-v4 shutup.png|Static shutup </gallery> |-|Icons= <gallery> larrycqmics-v4 icon.gif|Normal icon larrycqmics-v4 iconlose.gif|Danger icon larrycqmics-v4 iconwin.gif|Winning icon larrycqmics-v4 icon.png|Static normal icon larrycqmics-v4 iconlose.png|Static danger icon larrycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad (old)= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics-v4 idle.gif|Normal alexcqmics idle.gif|Normal (old) alexswordcqmics idle.gif|Sword (old) alexcqmicswhite idle.gif|White (old) </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter. ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics-v4 idle.png|Static idle pose alexcqmics-v4 left.gif|Left pose alexcqmics-v4 down.gif|Down pose alexcqmics-v4 up.gif|Up pose alexcqmics-v4 right.gif|Right pose alexcqmics-v4 left.png|Static left pose alexcqmics-v4 down.png|Static down pose alexcqmics-v4 up.png|Static up pose alexcqmics-v4 right.png|Static right pose alexcqmics-v4 leftmiss.gif|Left miss pose alexcqmics-v4 downmiss.gif|Down miss pose alexcqmics-v4 upmiss.gif|Up miss pose alexcqmics-v4 rightmiss.gif|Right miss pose alexcqmics-v4 leftmiss.png|Static left miss pose alexcqmics-v4 downmiss.png|Static down miss pose alexcqmics-v4 upmiss.png|Static up miss pose alexcqmics-v4 rightmiss.png|Static right miss pose alexcqmics-v4 spook.gif|Spook alexcqmics-v4 scared.gif|Scared alexcqmics-v4 spook.png|Static spook alexcqmics-v4 scared.png|Static scared alexcqmics-v4 sheet.png|Spritesheet alexcqmics-v4 icon.gif|Normal icon alexcqmics-v4 iconlose.gif|Danger icon alexcqmics-v4 iconwin.gif|Winning icon alexcqmics-v4 icon.png|Static normal icon alexcqmics-v4 iconlose.png|Static danger icon alexcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Normal (old)= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics-v4 idle.gif|Normal noahcqmicsz-v4 idle.gif|Z hoodie noahcqmics idle.gif|Normal (old) noahcqmicsz idle.gif|Z hoodie (old) noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics-v4 idle.png|Static idle pose noahcqmics-v4 left.gif|Left pose noahcqmics-v4 down.gif|Down pose noahcqmics-v4 up.gif|Up pose noahcqmics-v4 right.gif|Right pose noahcqmics-v4 left.png|Static left pose noahcqmics-v4 down.png|Static down pose noahcqmics-v4 up.png|Static up pose noahcqmics-v4 right.png|Static right pose noahcqmics-v4 leftmiss.gif|Left miss pose noahcqmics-v4 downmiss.gif|Down miss pose noahcqmics-v4 upmiss.gif|Up miss pose noahcqmics-v4 rightmiss.gif|Right miss pose noahcqmics-v4 leftmiss.png|Static left miss pose noahcqmics-v4 downmiss.png|Static down miss pose noahcqmics-v4 upmiss.png|Static up miss pose noahcqmics-v4 rightmiss.png|Static right miss pose noahcqmics-v4 spook.gif|Spook noahcqmics-v4 scared.gif|Scared noahcqmics-v4 spook.png|Static spook noahcqmics-v4 scared.png|Static scared noahcqmics-v4 sheet.png|Spritesheet </gallery> |-|Z hoodie= <gallery> noahcqmicsz-v4 idle.png|Static idle pose noahcqmicsz-v4 left.gif|Left pose noahcqmicsz-v4 down.gif|Down pose noahcqmicsz-v4 up.gif|Up pose noahcqmicsz-v4 right.gif|Right pose noahcqmicsz-v4 left.png|Static left pose noahcqmicsz-v4 down.png|Static down pose noahcqmicsz-v4 up.png|Static up pose noahcqmicsz-v4 right.png|Static right pose noahcqmicsz-v4 spook.gif|Spook noahcqmicsz-v4 scared.gif|Scared noahcqmicsz-v4 spook.png|Static spook noahcqmicsz-v4 scared.png|Static scared noahcqmicsz-v4 sheet.png|Spritesheet </gallery> |-|Normal (old)= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (old)= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics-v4 icon.gif|Normal icon noahcqmics-v4 iconlose.gif|Danger icon noahcqmics-v4 iconwin.gif|Winning icon noahcqmics-v4 icon.png|Static normal icon noahcqmics-v4 iconlose.png|Static danger icon noahcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Icons (old)= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=<gallery> Bumpo-v4 idle.gif|Normal Bumpo idle.gif|Old </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Bumpo-v4 idle.png|Static idle Bumpo-v4 left.gif|Left pose Bumpo-v4 down.gif|Down pose Bumpo-v4 up.gif|Up pose Bumpo-v4 right.gif|Right pose Bumpo-v4 left.png|Static left pose Bumpo-v4 down.png|Static down pose Bumpo-v4 up.png|Static up pose Bumpo-v4 right.png|Static right pose Bumpo-v4 leftmiss.gif|Left miss pose Bumpo-v4 downmiss.gif|Down miss pose Bumpo-v4 upmiss.gif|Up miss pose Bumpo-v4 rightmiss.gif|Right miss pose Bumpo-v4 leftmiss.png|Static left miss pose Bumpo-v4 downmiss.png|Static down miss pose Bumpo-v4 upmiss.png|Static up miss pose Bumpo-v4 rightmiss.png|Static right miss pose Bumpo-v4 icon.gif|Normal icon Bumpo-v4 iconlose.gif|Danger icon Bumpo-v4 iconwin.gif|Winning icon Bumpo-v4 icon.png|Static normal icon Bumpo-v4 iconlose.png|Static danger icon Bumpo-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif |icons=Skellycqmics icons.png }} <tabber> |-|Normal= <gallery> Skellycqmics-v4 icon.gif|Normal icon Skellycqmics-v4 iconlose.gif|Danger icon Skellycqmics-v4 iconwin.gif|Winning icon Skellycqmics-v4 icon.png|Static normal icon Skellycqmics-v4 iconlose.png|Static danger icon Skellycqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose Skellycqmics icon.png|Normal icon Skellycqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics-v4 idle.gif|Normal Chazcqmicswhite-v4 idle.gif|White Chazcqmics idle.gif|Normal (old) Chazcqmicswhite idle.gif|White (old) </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics-v4 idle.png|Static idle pose Chazcqmics-v4 left.gif|Left pose Chazcqmics-v4 down.gif|Down pose Chazcqmics-v4 up.gif|Up pose Chazcqmics-v4 right.gif|Right pose Chazcqmics-v4 left.png|Static left pose Chazcqmics-v4 down.png|Static down pose Chazcqmics-v4 up.png|Static up pose Chazcqmics-v4 right.png|Static right pose Chazcqmics-v4 leftmiss.gif|Left miss pose Chazcqmics-v4 downmiss.gif|Down miss pose Chazcqmics-v4 upmiss.gif|Up miss pose Chazcqmics-v4 rightmiss.gif|Right miss pose Chazcqmics-v4 leftmiss.png|Static left miss pose Chazcqmics-v4 downmiss.png|Static down miss pose Chazcqmics-v4 upmiss.png|Static up miss pose Chazcqmics-v4 rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite-v4 idle.png|Static idle pose Chazcqmicswhite-v4 left.gif|Left pose Chazcqmicswhite-v4 down.gif|Down pose Chazcqmicswhite-v4 up.gif|Up pose Chazcqmicswhite-v4 right.gif|Right pose Chazcqmicswhite-v4 left.png|Static left pose Chazcqmicswhite-v4 down.png|Static down pose Chazcqmicswhite-v4 up.png|Static up pose Chazcqmicswhite-v4 right.png|Static right pose Chazcqmicswhite-v4 leftmiss.gif|Left miss pose Chazcqmicswhite-v4 downmiss.gif|Down miss pose Chazcqmicswhite-v4 upmiss.gif|Up miss pose Chazcqmicswhite-v4 rightmiss.gif|Right miss pose Chazcqmicswhite-v4 leftmiss.png|Static left miss pose Chazcqmicswhite-v4 downmiss.png|Static down miss pose Chazcqmicswhite-v4 upmiss.png|Static up miss pose Chazcqmicswhite-v4 rightmiss.png|Static right miss pose </gallery> |-|Normal (old)= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White (olf)= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=<gallery> bfcqmics-v4 idle.gif|Normal bfcqmics idle.gif|Old </gallery> |icons=bfcqmics icons.png }} ====Gallery==== <tabber> |-|Normal= <gallery> bfcqmics-v4 idle.png|Static idle bfcqmics-v4 left.gif|Left pose bfcqmics-v4 down.gif|Down pose bfcqmics-v4 up.gif|Up pose bfcqmics-v4 right.gif|Right pose bfcqmics-v4 left.png|Static left pose bfcqmics-v4 down.png|Static down pose bfcqmics-v4 up.png|Static up pose bfcqmics-v4 right.png|Static right pose bfcqmics-v4 leftmiss.gif|Left miss pose bfcqmics-v4 downmiss.gif|Down miss pose bfcqmics-v4 upmiss.gif|Up miss pose bfcqmics-v4 rightmiss.gif|Right miss pose bfcqmics-v4 leftmiss.png|Static left miss pose bfcqmics-v4 downmiss.png|Static down miss pose bfcqmics-v4 upmiss.png|Static up miss pose bfcqmics-v4 rightmiss.png|Static right miss pose bfcqmics-v4 sheet.png|Spritesheet bfcqmics-v4 icon.gif|Normal icon bfcqmics-v4 iconlose.gif|Danger icon bfcqmics-v4 iconwin.gif|Winning icon bfcqmics-v4 icon.png|Static normal icon bfcqmics-v4 iconlose.png|Static danger icon bfcqmics-v4 iconwin.png|Static winning icon </gallery> |-|Old= <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> </tabber> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} ea56aceff8c895b996231a9d39b8f9e716a795dc Module:Message box 828 4 126 125 2023-09-02T14:26:19Z wikipedia>Pppery 0 Swap to SVG per edit request Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Information icon4.svg', imageSize) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) 089f9a4c10798567f119eb892b501e6b366f6954 127 126 2023-09-02T22:54:30Z wikipedia>Anomie 0 [[:File:Cscr-featured.svg]] needs a link to the description page for license and attribution. Add the ability for the configuration to specify a flag to accomplish this. Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image self.typeImageNeedsLink = typeData.imageNeedsLink -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" ) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) f2fb84f7b817d2d88747f57c40902a0d8be8158a 128 127 2023-10-24T21:35:37Z JsfasdF256 2 72 revisions imported from [[:wikipedia:Module:Message_box]] Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image self.typeImageNeedsLink = typeData.imageNeedsLink -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" ) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) f2fb84f7b817d2d88747f57c40902a0d8be8158a Module:Message box/configuration 828 5 159 158 2023-09-02T22:51:56Z wikipedia>Anomie 0 [[:File:Cscr-featured.svg]] needs a link for license and attribution. Add a flag to indicate that. Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>', templatestyles = 'Module:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'Module:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'Module:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox license.png' -- @todo We need an SVG version of this }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg', imageNeedsLink = true }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes', templatestyles = 'Module:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'Module:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'Talk message boxes', templatestyles = 'Module:Message box/tmbox.css' } } 3444de70eca420d56af19d869f9e8c448ddca1cc 160 159 2023-09-08T14:09:56Z wikipedia>Pppery 0 Use SVG per edit request Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>', templatestyles = 'Module:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'Module:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'Module:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox-license.svg' }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg', imageNeedsLink = true }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes', templatestyles = 'Module:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'Module:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'Talk message boxes', templatestyles = 'Module:Message box/tmbox.css' } } 27f00af5cf3939613e9156acd5e62a3469d03d81 161 160 2023-10-24T21:36:38Z JsfasdF256 2 32 revisions imported from [[:wikipedia:Module:Message_box/configuration]] Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>', templatestyles = 'Module:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'Module:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'Module:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox-license.svg' }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg', imageNeedsLink = true }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes', templatestyles = 'Module:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'Module:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'Talk message boxes', templatestyles = 'Module:Message box/tmbox.css' } } 27f00af5cf3939613e9156acd5e62a3469d03d81 MediaWiki:Gadget-switcher.js 8 38 1092 1091 2023-09-08T21:46:53Z wikipedia>Izno 0 per tper javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) { var selected, $radio; var switchers = [] var radioName = 'switcher-' + i; $.each( container.children, function ( j, switcher ) { var label = switcher.querySelector( '.switcher-label' ); if ( !label || !label.childNodes.length ) { return; } switchers.push( switcher ); $radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( selected ).hide(); $( switcher ).show(); selected = switcher; } ); if ( !selected ) { // Mark the first one as selected selected = switcher; $radio.prop( 'checked', true ); } else if ( label.getAttribute( 'data-switcher-default' ) !== null ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block; margin-left:1ex;"></label>' ).append( $radio, label.childNodes ).appendTo( container ); $( label ).remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block; margin-left:1ex;">Show all</label>' ).prepend( $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( switchers ).show(); selected = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); 23d60aaf464f6c99c495d65bf86262f03d8e4a55 1093 1092 2023-09-08T21:47:16Z wikipedia>Izno 0 Reverted edit by [[Special:Contribs/Izno|Izno]] ([[User talk:Izno|talk]]) to last version by Krinkle javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) { var selected, $radio; var switchers = [] var radioName = 'switcher-' + i; $.each( container.children, function ( j, switcher ) { var label = switcher.querySelector( '.switcher-label' ); if ( !label || !label.childNodes.length ) { return; } switchers.push( switcher ); $radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( selected ).hide(); $( switcher ).show(); selected = switcher; } ); if ( !selected ) { // Mark the first one as selected selected = switcher; $radio.prop( 'checked', true ); } else if ( label.getAttribute( 'data-switcher-default' ) !== null ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container ); $( label ).remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( switchers ).show(); selected = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); 762811537a90373de140d64f5c79f59d8dc605a6 1094 1093 2023-09-09T03:39:56Z wikipedia>Izno 0 per talk page javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) { if ( i == 0 ) { mw.loader.using(['mediawiki.util'], function(){mw.util.addCSS('.switcher-container label input{margin-right:0.5em}')}) } var selected, $radio; var switchers = [] var radioName = 'switcher-' + i; $.each( container.children, function ( j, switcher ) { var label = switcher.querySelector( '.switcher-label' ); if ( !label || !label.childNodes.length ) { return; } switchers.push( switcher ); $radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( selected ).hide(); $( switcher ).show(); selected = switcher; } ); if ( !selected ) { // Mark the first one as selected selected = switcher; $radio.prop( 'checked', true ); } else if ( label.getAttribute( 'data-switcher-default' ) !== null ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container ); $( label ).remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( switchers ).show(); selected = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); a175070d6651aee18a8e80f210c33dce068b8020 Module:Navbar 828 8 274 273 2023-10-10T22:34:57Z wikipedia>Pppery 0 Per edit request on talk Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p 047f307758c878eb3e99ed1768cc40920a6ec5fa 275 274 2023-10-24T21:55:20Z JsfasdF256 2 38 revisions imported from [[:wikipedia:Module:Navbar]] Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p 047f307758c878eb3e99ed1768cc40920a6ec5fa Main Page 0 1 1 2023-10-23T22:58:52Z MediaWiki default 1 Create main page wikitext text/x-wiki __NOTOC__ == Welcome to {{SITENAME}}! == This Main Page was created automatically and it seems it hasn't been replaced yet. === For the bureaucrat(s) of this wiki === Hello, and welcome to your new wiki! Thank you for choosing WikiTide for the hosting of your wiki, we hope you will enjoy our hosting. You can immediately start working on your wiki or whenever you want. Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links: * [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users) * [[meta:Special:MyLanguage/FAQ|WikiTide FAQ]] * [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.) ==== I still don't understand X! ==== Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here: * [[meta:Special:MyLanguage/Help center|On our own WikiTide wiki]] * On [[phorge:|Phorge]] * On [https://wikiforge.net/discord Discord] * On IRC in #wikiforge on irc.libera.chat ([irc://irc.libera.chat/%23wikiforge direct link]; [https://web.libera.chat/?channel=#wikiforge webchat]) === For visitors of this wiki === Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later! bb47436b9bd8510005d12ff60f515e06d70eb554 Module:Arguments 828 2 26 25 2023-10-24T16:19:23Z JsfasdF256 2 24 revisions imported from [[:wikipedia:Module:Arguments]]: Imported from Wikipedia Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 Module:Yesno 828 3 55 54 2023-10-24T19:41:14Z JsfasdF256 2 28 revisions imported from [[:wikipedia:Module:Yesno]] Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or tonumber(val) == 0 then return false else return default end end f767643e7d12126d020d88d662a3dd057817b9dc Module:Italic title 828 6 185 184 2023-10-24T21:53:54Z JsfasdF256 2 23 revisions imported from [[:wikipedia:Module:Italic_title]] Scribunto text/plain -- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) %(([^%(%)]+)%)$' ) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then titleParts.title = self.title for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = titleParts.title:gsub( pattern, italicize ) titleParts.title = italicizedTitle -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) return ItalicTitle.new() :italicize('dab') :render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p 9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8 Module:TableTools 828 7 236 235 2023-10-24T21:54:40Z JsfasdF256 2 50 revisions imported from [[:wikipedia:Module:TableTools]] Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = _deepCopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if valueToFind is a member of the array, and false otherwise. ------------------------------------------------------------------------------------ function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 085e7094ac84eb0132ee65822cf3f69cd8ba3d81 Module:Navbar/configuration 828 9 292 291 2023-10-24T21:56:40Z JsfasdF256 2 16 revisions imported from [[:wikipedia:Module:Navbar/configuration]] Scribunto text/plain return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Hlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } b007c336b17ec4bcd4d5a9dca9f8cba301662b55 Module:Infobox 828 10 376 375 2023-10-24T21:58:26Z JsfasdF256 2 83 revisions imported from [[:wikipedia:Module:Infobox]] Scribunto text/plain local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' }, hlist_t = { patterns = { '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found = false, styles = 'Hlist/styles.css' } } local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass }) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class }) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true has_list_class({ args.aboveclass }) root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true has_list_class({ args.belowclass }) root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ subheaderArgs.rowclass, subheaderArgs.class }) local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ imageArgs.rowclass, imageArgs.class }) local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(require('Module:Italic title')._main({})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() local hlist_templatestyles = '' if lists.hlist_t.found then hlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.hlist_t.styles } } end local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because the rows of interest invoking -- each class may not be on a specific page hlist_templatestyles, plainlist_templatestyles, base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) has_list_class({ args.bodyclass }) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p 0ddb7e5c8426d67cd589b710efb9912ddfb67fea Template:Infobox 10 11 595 594 2023-10-24T22:12:12Z JsfasdF256 2 218 revisions imported from [[:wikipedia:Template:Infobox]] wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 817a9f5b6524eced06a57bd1d5fd7179f9369bf2 Module:Infobox/styles.css 828 12 601 600 2023-10-24T22:14:56Z JsfasdF256 2 5 revisions imported from [[:wikipedia:Module:Infobox/styles.css]] sanitized-css text/css /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } .infobox .navbar { font-size: 100%; } /* T281642 */ body.skin-minerva .infobox-header, body.skin-minerva .infobox-subheader, body.skin-minerva .infobox-above, body.skin-minerva .infobox-title, body.skin-minerva .infobox-image, body.skin-minerva .infobox-full-data, body.skin-minerva .infobox-below { text-align: center; } e8de6d96f4fde53afc4a6b0fed534405ab59b0a7 Template:Hlist/styles.css 10 13 620 619 2023-10-24T22:29:03Z JsfasdF256 2 18 revisions imported from [[:wikipedia:Template:Hlist/styles.css]] sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 8c9dd9c9c00f30eead17fe10f51d183333e81f33 Template:Plainlist/styles.css 10 14 626 625 2023-10-24T22:29:14Z JsfasdF256 2 5 revisions imported from [[:wikipedia:Template:Plainlist/styles.css]] sanitized-css text/css /* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 51706efa229ff8794c0d94f260a208e7c5e6ec30 Module:Navbar/styles.css 828 15 650 649 2023-10-24T22:30:40Z JsfasdF256 2 23 revisions imported from [[:wikipedia:Module:Navbar/styles.css]] sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .navbar a > abbr { text-decoration: inherit; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } 9d4056f949b4f0b159e3d40dfb1a5f01e72f9571 Template:Template other 10 16 657 656 2023-10-24T22:30:54Z JsfasdF256 2 6 revisions imported from [[:wikipedia:Template:Template_other]] wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 06fb13d264df967b5232141067eb7d2b67372d76 Template:Infobox character 10 17 658 2023-10-24T22:37:55Z JsfasdF256 2 Created page with "{{Infobox | name = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption = {{{caption|}}} | label1 = Debut | data1 = {{{debut|}}} | header2 = Information | label3 = Alias | data3 = {{{alias|}}} | label4 = Gender | data4 = {{{gender|}}} | label5 = Occupation | data5 = {{{occupation|}}} }}" wikitext text/x-wiki {{Infobox | name = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption = {{{caption|}}} | label1 = Debut | data1 = {{{debut|}}} | header2 = Information | label3 = Alias | data3 = {{{alias|}}} | label4 = Gender | data4 = {{{gender|}}} | label5 = Occupation | data5 = {{{occupation|}}} }} 4a021590827b01a4dcdaf468fc0352a11cc3ef19 659 658 2023-10-24T22:40:52Z JsfasdF256 2 fix header wikitext text/x-wiki {{Infobox | above = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption = {{{caption|}}} | label1 = Debut | data1 = {{{debut|}}} | header2 = Information | label3 = Alias | data3 = {{{alias|}}} | label4 = Gender | data4 = {{{gender|}}} | label5 = Occupation | data5 = {{{occupation|}}} }} 8ecfd68f2df812a743490169da220c547ae0754d Template:Infobox character 10 17 660 659 2023-10-24T22:43:25Z JsfasdF256 2 Add information on how to use the template wikitext text/x-wiki {{Infobox | above = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption = {{{caption|}}} | label1 = Debut | data1 = {{{debut|}}} | header2 = Information | label3 = Alias | data3 = {{{alias|}}} | label4 = Gender | data4 = {{{gender|}}} | label5 = Occupation | data5 = {{{occupation|}}} }} <noinclude> <pre> {{Infobox character | name = | image = | caption = | debut = | alias = | gender = | occupation = }} </pre> </noinclude> 3bd86c057c8184646819921bc783b4faa045b178 Template:Ambox 10 18 752 751 2023-10-25T02:22:20Z JsfasdF256 2 91 revisions imported from [[:wikipedia:Template:Ambox]] wikitext text/x-wiki {{#invoke:Message box|ambox}}{{#ifeq:{{{small}}};{{NAMESPACENUMBER}}|left;0|[[Category:Articles using small message boxes]]}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 0c13ec156138ae0499c998cc3d7fbbeac4aeeed6 Module:Category handler 828 19 775 774 2023-10-25T02:23:16Z JsfasdF256 2 22 revisions imported from [[:wikipedia:Module:Category_handler]] Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f Module:Category handler/data 828 20 784 783 2023-10-25T02:25:06Z JsfasdF256 2 8 revisions imported from [[:wikipedia:Module:Category_handler/data]] Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 Module:Category handler/shared 828 21 795 794 2023-10-25T02:27:15Z JsfasdF256 2 10 revisions imported from [[:wikipedia:Module:Category_handler/shared]] Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 Module:Category handler/config 828 22 812 811 2023-10-25T02:27:31Z JsfasdF256 2 16 revisions imported from [[:wikipedia:Module:Category_handler/config]] Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d Module:Category handler/blacklist 828 23 823 822 2023-10-25T02:27:46Z JsfasdF256 2 10 revisions imported from [[:wikipedia:Module:Category_handler/blacklist]] Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template index/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855 Module:Namespace detect/data 828 24 841 840 2023-10-25T02:28:39Z JsfasdF256 2 17 revisions imported from [[:wikipedia:Module:Namespace_detect/data]] Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:Namespace detect 828 25 861 860 2023-10-25T02:28:58Z JsfasdF256 2 19 revisions imported from [[:wikipedia:Module:Namespace_detect]] Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p a4757000273064f151f0f22dc0e139092e5ff443 Module:Namespace detect/config 828 26 871 870 2023-10-25T02:29:45Z JsfasdF256 2 9 revisions imported from [[:wikipedia:Module:Namespace_detect/config]] Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Message box/ambox.css 828 27 891 890 2023-10-25T02:30:45Z JsfasdF256 2 19 revisions imported from [[:wikipedia:Module:Message_box/ambox.css]] sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ambox .mbox-image-div { width: 52px; } /* Hack around MobileFrontend being opinionated */ html.client-js body.skin-minerva .mbox-text-span { margin-left: 23px !important; } @media (min-width: 720px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } 29898fdc5160b39a8f580c76efe77afa1f6f58a4 Template:Stub 10 28 892 2023-10-25T02:35:44Z JsfasdF256 2 Created page with "{{Ambox |issue=This article is a '''stub'''. |type=content |fix=You can help HeartStone Destiny Wiki by expanding it. |cat=Stubs }}" wikitext text/x-wiki {{Ambox |issue=This article is a '''stub'''. |type=content |fix=You can help HeartStone Destiny Wiki by expanding it. |cat=Stubs }} c7b04eb876ef0d85a42dbc791f9b123801d09e58 893 892 2023-10-25T02:38:01Z JsfasdF256 2 name wikitext text/x-wiki {{Ambox |name=Stub |issue=This article is a '''stub'''. |type=content |fix=You can help HeartStone Destiny Wiki by expanding it. |cat=Stubs }} f85e9c186cc25b0bf93cf1e7b89c0fd8c110a614 Noah 0 29 894 2023-10-25T02:40:59Z JsfasdF256 2 Created page with "{{stub}} {{Infobox character |name=Noah |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Noah''' is the main character of the webcomic [[HeartStone Destiny]]." wikitext text/x-wiki {{stub}} {{Infobox character |name=Noah |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Noah''' is the main character of the webcomic [[HeartStone Destiny]]. 2d314de0e3ea017c5ce0c70872a3d9615328bc9b 896 894 2023-10-26T04:49:17Z JsfasdF256 2 [[Category:Characters]] wikitext text/x-wiki {{stub}} {{Infobox character |name=Noah |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Noah''' is the main character of the webcomic [[HeartStone Destiny]]. [[Category:Characters]] dcec75d21791c86d10e6ea13c3bfee4e68acb2a5 1097 896 2023-11-14T23:59:22Z JsfasdF256 2 Headings wikitext text/x-wiki {{stub}} {{Infobox character |name=Noah |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Noah''' is the main character of the webcomic [[HeartStone Destiny]]. ==Appearance== ==Development== ==Personality== [[Category:Characters]] 4530177c76387fe1b59febb5cf52ef350a8dbfff MediaWiki:Common.css 8 30 895 2023-10-26T04:48:29Z JsfasdF256 2 Infobox styles from https://en.wikipedia.org/wiki/MediaWiki%3ACommon.css css text/css /* CSS placed here will be applied to all skins */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } e1bec8a8a7fc8c714835ef000329bf3c34d366cf Category:Characters 14 31 897 2023-10-26T04:50:15Z JsfasdF256 2 Created page with "[[Category:Articles]]" wikitext text/x-wiki [[Category:Articles]] 2e53679f3407f3913dfb124fc48c64c5f96a0d7f Vs HeartStone Destiny 0 35 1057 1056 2023-10-26T05:40:25Z JsfasdF256 2 37 revisions imported wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8 1079 1057 2023-10-26T05:41:44Z JsfasdF256 2 21 revisions imported wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} Cqmics Funkin is a mod directed by '''Cqmics'''. __TOC__ {{-}} ==Characters== {{#tag:tabber| {{!}}-{{!}}Larry= ===Larry=== {{Character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Alex= ===Alex=== {{Character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> {{!}}-{{!}}Noah= ===Noah=== {{Character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> {{!}}-{{!}}Carlos= ===Carlos=== {{Character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| {{!}}-{{!}}Normal= <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bag= <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Icons= carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} {{!}}-{{!}}Bumpo= ===Bumpo=== {{Character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Wrath= ===Wrath=== {{Character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Charles= ===Charles=== {{Character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Skelly= ===Skelly=== {{Character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> {{!}}-{{!}}Chaz= ===Chaz=== {{Character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> {{!}}-{{!}}Vibe King= ===Vibe King=== {{Character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Bray= ===Bray=== {{Character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> {{!}}-{{!}}Kana= ===Kana=== {{Character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> {{!}}-{{!}}Pluto= ===Pluto=== {{Character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> {{!}}-{{!}}Boyfriend= ===Boyfriend=== {{Character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== <tabber> |-|Main= {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} |-|Covers= {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *{{GameBanana|mods/447472}} d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8 1080 1079 2023-10-26T05:49:53Z JsfasdF256 2 Fix download link, remove major tabbers, add FNF mods category wikitext text/x-wiki {{stub}} {{ModInfo |image=Cqmics Funkin logo.gif |caption= |release= |projectmanager= |director=Cqmics |codirector= |creator= |charter=JordanSantiagoYT |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine=[[Psych Engine]] |theme= |gamegenre= }} '''Cqmics Funkin''' is a Friday Night Funkin' mod directed by Noah, also known as Cqmics. __TOC__ {{-}} ==Characters== ===Larry=== {{Infobox character |name=Larry |image=<gallery> Larrycqmics idle.gif|Normal Larrycqmicsmad idle.gif|Mad Larrycqmicsguitar idle.gif|Guitar </gallery> |icons=larrycqmics icons.png }} <tabber> |-|Normal= <gallery> Larrycqmics idle.png|Static idle pose Larrycqmics left.gif|Left pose Larrycqmics down.gif|Down pose Larrycqmics up.gif|Up pose Larrycqmics right.gif|Right pose Larrycqmics left.png|Static left pose Larrycqmics down.png|Static down pose Larrycqmics up.png|Static up pose Larrycqmics right.png|Static right pose Larrycqmics icon.png|Normal icon Larrycqmics iconlose.png|Danger icon </gallery> |-|Mad= <gallery> Larrycqmicsmad idle.png|Static idle pose Larrycqmicsmad left.gif|Left pose Larrycqmicsmad down.gif|Down pose Larrycqmicsmad up.gif|Up pose Larrycqmicsmad right.gif|Right pose Larrycqmicsmad left.png|Static left pose Larrycqmicsmad down.png|Static down pose Larrycqmicsmad up.png|Static up pose Larrycqmicsmad right.png|Static right pose </gallery> |-|Guitar= <gallery> Larrycqmicsguitar idle.png|Static idle pose Larrycqmicsguitar left.gif|Left pose Larrycqmicsguitar down.gif|Down pose Larrycqmicsguitar up.gif|Up pose Larrycqmicsguitar right.gif|Right pose Larrycqmicsguitar left.png|Static left pose Larrycqmicsguitar down.png|Static down pose Larrycqmicsguitar up.png|Static up pose Larrycqmicsguitar right.png|Static right pose </gallery> </tabber> ===Alex=== {{Infobox character |name=Alex |image=<gallery> alexcqmics idle.gif|Normal alexswordcqmics idle.gif|Sword alexcqmicswhite idle.gif|White </gallery> |imagecaption= |aliases= |relatives= |relationships= |affiliation= |occupation= |marital= |sexuality= |age= |birthPlace= |birthday= |deathDate= |Status= |species= |subspecies= |gender= |height= |weight= |eyes= |hair color= |fur color= |feather color= |created by= |voiced by= |appearsin= |debut= |icons=alexcqmics icons.png |headercolor= |headerfontcolor= }} ====Gallery==== <tabber> |-|Normal= <gallery> alexcqmics idle.png|Static idle pose alexcqmics left.gif|Left pose alexcqmics down.gif|Down pose alexcqmics up.gif|Up pose alexcqmics right.gif|Right pose alexcqmics left.png|Static left pose alexcqmics down.png|Static down pose alexcqmics up.png|Static up pose alexcqmics right.png|Static right pose alexcqmics leftmiss.gif|Left miss pose alexcqmics downmiss.gif|Down miss pose alexcqmics upmiss.gif|Up miss pose alexcqmics rightmiss.gif|Right miss pose alexcqmics leftmiss.png|Static left miss pose alexcqmics downmiss.png|Static down miss pose alexcqmics upmiss.png|Static up miss pose alexcqmics rightmiss.png|Static right miss pose alexcqmics icon.png|Normal icon alexcqmics iconlose.png|Danger icon </gallery> |-|Sword= <gallery> alexswordcqmics idle.png|Static idle pose alexswordcqmics left.gif|Left pose alexswordcqmics down.gif|Down pose alexswordcqmics up.gif|Up pose alexswordcqmics right.gif|Right pose alexswordcqmics left.png|Static left pose alexswordcqmics down.png|Static down pose alexswordcqmics up.png|Static up pose alexswordcqmics right.png|Static right pose alexswordcqmics leftmiss.gif|Left miss pose alexswordcqmics downmiss.gif|Down miss pose alexswordcqmics upmiss.gif|Up miss pose alexswordcqmics rightmiss.gif|Right miss pose alexswordcqmics leftmiss.png|Static left miss pose alexswordcqmics downmiss.png|Static down miss pose alexswordcqmics upmiss.png|Static up miss pose alexswordcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> alexcqmicswhite idle.png|Static idle pose alexcqmicswhite left.gif|Left pose alexcqmicswhite down.gif|Down pose alexcqmicswhite up.gif|Up pose alexcqmicswhite right.gif|Right pose alexcqmicswhite left.png|Static left pose alexcqmicswhite down.png|Static down pose alexcqmicswhite up.png|Static up pose alexcqmicswhite right.png|Static right pose alexcqmicswhite leftmiss.gif|Left miss pose alexcqmicswhite downmiss.gif|Down miss pose alexcqmicswhite upmiss.gif|Up miss pose alexcqmicswhite rightmiss.gif|Right miss pose alexcqmicswhite leftmiss.png|Static left miss pose alexcqmicswhite downmiss.png|Static down miss pose alexcqmicswhite upmiss.png|Static up miss pose alexcqmicswhite rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> alexcqmics die.gif|Game over alexcqmics dead.gif|Death loop alexcqmics die.png|Static game over alexcqmics dead.png|Static death loop </gallery> </tabber> ===Noah=== {{Infobox character |name=Noah |image=<gallery> noahcqmics idle.gif|Normal noahcqmicsz idle.gif|Z hoodie noahcqmicshh idle.gif|Hump House 4 noahcqmicszwhite idle.gif|Z hoodie (white) noahcqmicszgray idle.gif|Z hoodie (gray) </gallery> |icons=noahcqmics icons.png }} <tabber> |-|Normal= <gallery> noahcqmics idle.png|Static idle pose noahcqmics left.gif|Left pose noahcqmics down.gif|Down pose noahcqmics up.gif|Up pose noahcqmics right.gif|Right pose noahcqmics left.png|Static left pose noahcqmics down.png|Static down pose noahcqmics up.png|Static up pose noahcqmics right.png|Static right pose noahcqmics leftmiss.gif|Left miss pose noahcqmics downmiss.gif|Down miss pose noahcqmics upmiss.gif|Up miss pose noahcqmics rightmiss.gif|Right miss pose noahcqmics leftmiss.png|Static left miss pose noahcqmics downmiss.png|Static down miss pose noahcqmics upmiss.png|Static up miss pose noahcqmics rightmiss.png|Static right miss pose </gallery> |-|Z hoodie= <gallery> noahcqmicsz idle.png|Static idle pose noahcqmicsz left.gif|Left pose noahcqmicsz down.gif|Down pose noahcqmicsz up.gif|Up pose noahcqmicsz right.gif|Right pose noahcqmicsz left.png|Static left pose noahcqmicsz down.png|Static down pose noahcqmicsz up.png|Static up pose noahcqmicsz right.png|Static right pose noahcqmicsz leftmiss.gif|Left miss pose noahcqmicsz downmiss.gif|Down miss pose noahcqmicsz upmiss.gif|Up miss pose noahcqmicsz rightmiss.gif|Right miss pose noahcqmicsz leftmiss.png|Static left miss pose noahcqmicsz downmiss.png|Static down miss pose noahcqmicsz upmiss.png|Static up miss pose noahcqmicsz rightmiss.png|Static right miss pose </gallery> |-|Hump House 4= <gallery> noahcqmicshh idle.png|Static idle pose noahcqmicshh left.gif|Left pose noahcqmicshh down.gif|Down pose noahcqmicshh up.gif|Up pose noahcqmicshh right.gif|Right pose noahcqmicshh left.png|Static left pose noahcqmicshh down.png|Static down pose noahcqmicshh up.png|Static up pose noahcqmicshh right.png|Static right pose </gallery> |-|Z hoodie (white)= <gallery> noahcqmicszwhite idle.png|Static idle pose noahcqmicszwhite left.gif|Left pose noahcqmicszwhite down.gif|Down pose noahcqmicszwhite up.gif|Up pose noahcqmicszwhite right.gif|Right pose noahcqmicszwhite left.png|Static left pose noahcqmicszwhite down.png|Static down pose noahcqmicszwhite up.png|Static up pose noahcqmicszwhite right.png|Static right pose noahcqmicszwhite leftmiss.gif|Left miss pose noahcqmicszwhite downmiss.gif|Down miss pose noahcqmicszwhite upmiss.gif|Up miss pose noahcqmicszwhite rightmiss.gif|Right miss pose noahcqmicszwhite leftmiss.png|Static left miss pose noahcqmicszwhite downmiss.png|Static down miss pose noahcqmicszwhite upmiss.png|Static up miss pose noahcqmicszwhite rightmiss.png|Static right miss pose </gallery> |-|Z hoodie (gray)= <gallery> noahcqmicszgray idle.png|Static idle pose noahcqmicszgray left.gif|Left pose noahcqmicszgray down.gif|Down pose noahcqmicszgray up.gif|Up pose noahcqmicszgray right.gif|Right pose noahcqmicszgray left.png|Static left pose noahcqmicszgray down.png|Static down pose noahcqmicszgray up.png|Static up pose noahcqmicszgray right.png|Static right pose noahcqmicszgray leftmiss.gif|Left miss pose noahcqmicszgray downmiss.gif|Down miss pose noahcqmicszgray upmiss.gif|Up miss pose noahcqmicszgray rightmiss.gif|Right miss pose noahcqmicszgray leftmiss.png|Static left miss pose noahcqmicszgray downmiss.png|Static down miss pose noahcqmicszgray upmiss.png|Static up miss pose noahcqmicszgray rightmiss.png|Static right miss pose </gallery> |-|Death= <gallery> noahcqmics die.gif|Game over noahcqmics dead.gif|Death loop noahcqmics die.png|Static game over noahcqmics dead.png|Static death loop </gallery> |-|Icons= <gallery> noahcqmics icon.png|Normal icon noahcqmics iconlose.png|Danger icon </gallery> </tabber> ===Carlos=== {{Infobox character |name=Carlos |image=<gallery> carloscqmics idle.gif|Normal carlosbagcqmics idle.gif|Bag </gallery> |icons=carloscqmics icons.png }} {{#tag:tabber| <gallery> carloscqmics idle.png|Static idle pose carloscqmics left.gif|Left pose carloscqmics down.gif|Down pose carloscqmics up.gif|Up pose carloscqmics right.gif|Right pose carloscqmics left.png|Static left pose carloscqmics down.png|Static down pose carloscqmics up.png|Static up pose carloscqmics right.png|Static right pose carloscqmics leftmiss.gif|Left miss pose carloscqmics downmiss.gif|Down miss pose carloscqmics upmiss.gif|Up miss pose carloscqmics rightmiss.gif|Right miss pose carloscqmics leftmiss.png|Static left miss pose carloscqmics downmiss.png|Static down miss pose carloscqmics upmiss.png|Static up miss pose carloscqmics rightmiss.png|Static right miss pose </gallery> <gallery> carlosbagcqmics idle.png|Static idle pose carlosbagcqmics left.gif|Left pose carlosbagcqmics down.gif|Down pose carlosbagcqmics up.gif|Up pose carlosbagcqmics right.gif|Right pose carlosbagcqmics left.png|Static left pose carlosbagcqmics down.png|Static down pose carlosbagcqmics up.png|Static up pose carlosbagcqmics right.png|Static right pose carlosbagcqmics leftmiss.gif|Left miss pose carlosbagcqmics downmiss.gif|Down miss pose carlosbagcqmics upmiss.gif|Up miss pose carlosbagcqmics rightmiss.gif|Right miss pose carlosbagcqmics leftmiss.png|Static left miss pose carlosbagcqmics downmiss.png|Static down miss pose carlosbagcqmics upmiss.png|Static up miss pose carlosbagcqmics rightmiss.png|Static right miss pose </gallery> carloscqmics icon.png|Normal icon carloscqmics iconlose.png|Danger icon }} ===Bumpo=== {{Infobox character |name=Bumpo |image=Bumpo idle.gif }} <gallery> Bumpo idle.png|Static idle pose Bumpo left.gif|Left pose Bumpo down.gif|Down pose Bumpo up.gif|Up pose Bumpo upalt.gif|Up alt pose Bumpo right.gif|Right pose Bumpo left.png|Static left pose Bumpo down.png|Static down pose Bumpo up.png|Static up pose Bumpo upalt.png|Static up alt pose Bumpo right.png|Static right pose Bumpo leftmiss.gif|Left miss pose Bumpo downmiss.gif|Down miss pose Bumpo upmiss.gif|Up miss pose Bumpo rightmiss.gif|Right miss pose Bumpo leftmiss.png|Static left miss pose Bumpo downmiss.png|Static down miss pose Bumpo upmiss.png|Static up miss pose Bumpo rightmiss.png|Static right miss pose </gallery> ===Wrath=== {{Infobox character |name=Wrath |image=wrathcqmics idle.gif }} <gallery> wrathcqmics idle.png|Static idle pose wrathcqmics left.gif|Left pose wrathcqmics down.gif|Down pose wrathcqmics up.gif|Up pose wrathcqmics right.gif|Right pose wrathcqmics left.png|Static left pose wrathcqmics down.png|Static down pose wrathcqmics up.png|Static up pose wrathcqmics right.png|Static right pose wrathcqmics leftmiss.gif|Left miss pose wrathcqmics downmiss.gif|Down miss pose wrathcqmics upmiss.gif|Up miss pose wrathcqmics rightmiss.gif|Right miss pose wrathcqmics leftmiss.png|Static left miss pose wrathcqmics downmiss.png|Static down miss pose wrathcqmics upmiss.png|Static up miss pose wrathcqmics rightmiss.png|Static right miss pose </gallery> ===Charles=== {{Infobox character |name=Charles |image=Charlescqmics idle.gif }} <gallery> Charlescqmics idle.png|Static idle pose Charlescqmics left.gif|Left pose Charlescqmics down.gif|Down pose Charlescqmics up.gif|Up pose Charlescqmics right.gif|Right pose Charlescqmics left.png|Static left pose Charlescqmics down.png|Static down pose Charlescqmics up.png|Static up pose Charlescqmics right.png|Static right pose Charlescqmics right.png|Static right pose Charlescqmics aim.gif|Aim pose Charlescqmics shoot.gif|Shoot pose Charlescqmics aim.png|Static aim pose Charlescqmics shoot.png|Static shoot pose Charlescqmics leftmiss.gif|Left miss pose Charlescqmics downmiss.gif|Down miss pose Charlescqmics upmiss.gif|Up miss pose Charlescqmics rightmiss.gif|Right miss pose Charlescqmics leftmiss.png|Static left miss pose Charlescqmics downmiss.png|Static down miss pose Charlescqmics upmiss.png|Static up miss pose Charlescqmics rightmiss.png|Static right miss pose </gallery> ===Skelly=== {{Infobox character |name=Skelly |image=Skellycqmics idle.gif }} <gallery> Skellycqmics idle.png|Static idle pose Skellycqmics left.gif|Left pose Skellycqmics down.gif|Down pose Skellycqmics up.gif|Up pose Skellycqmics right.gif|Right pose Skellycqmics left.png|Static left pose Skellycqmics down.png|Static down pose Skellycqmics up.png|Static up pose Skellycqmics right.png|Static right pose Skellycqmics miss.gif|Miss pose Skellycqmics miss.png|Static miss pose </gallery> ===Chaz=== {{Infobox character |name=Chaz |image=<gallery> Chazcqmics idle.gif|Normal Chazcqmicswhite idle.gif|White </gallery> }} ====Gallery==== <tabber> |-|Normal= <gallery> Chazcqmics idle.png|Static idle pose Chazcqmics left.gif|Left pose Chazcqmics down.gif|Down pose Chazcqmics up.gif|Up pose Chazcqmics right.gif|Right pose Chazcqmics left.png|Static left pose Chazcqmics down.png|Static down pose Chazcqmics up.png|Static up pose Chazcqmics right.png|Static right pose Chazcqmics leftmiss.gif|Left miss pose Chazcqmics downmiss.gif|Down miss pose Chazcqmics upmiss.gif|Up miss pose Chazcqmics rightmiss.gif|Right miss pose Chazcqmics leftmiss.png|Static left miss pose Chazcqmics downmiss.png|Static down miss pose Chazcqmics upmiss.png|Static up miss pose Chazcqmics rightmiss.png|Static right miss pose </gallery> |-|White= <gallery> Chazcqmicswhite idle.png|Static idle pose Chazcqmicswhite left.gif|Left pose Chazcqmicswhite down.gif|Down pose Chazcqmicswhite up.gif|Up pose Chazcqmicswhite right.gif|Right pose Chazcqmicswhite left.png|Static left pose Chazcqmicswhite down.png|Static down pose Chazcqmicswhite up.png|Static up pose Chazcqmicswhite right.png|Static right pose Chazcqmicswhite leftmiss.gif|Left miss pose Chazcqmicswhite downmiss.gif|Down miss pose Chazcqmicswhite upmiss.gif|Up miss pose Chazcqmicswhite rightmiss.gif|Right miss pose Chazcqmicswhite leftmiss.png|Static left miss pose Chazcqmicswhite downmiss.png|Static down miss pose Chazcqmicswhite upmiss.png|Static up miss pose Chazcqmicswhite rightmiss.png|Static right miss pose </gallery> </tabber> ===Vibe King=== {{Infobox character |name=Vibe King |image=<gallery> vibeking idle.gif|Normal vibekinggray idle.gif|Gray </gallery> }} <gallery> vibeking idle.png|Static idle pose vibeking left.gif|Left pose vibeking down.gif|Down pose vibeking up.gif|Up pose vibeking right.gif|Right pose vibeking left.png|Static left pose vibeking down.png|Static down pose vibeking up.png|Static up pose vibeking right.png|Static right pose vibeking leftmiss.gif|Left miss pose vibeking downmiss.gif|Down miss pose vibeking upmiss.gif|Up miss pose vibeking rightmiss.gif|Right miss pose vibeking leftmiss.png|Static left miss pose vibeking downmiss.png|Static down miss pose vibeking upmiss.png|Static up miss pose vibeking rightmiss.png|Static right miss pose </gallery> <gallery> vibekinggray idle.png|Static idle pose vibekinggray left.gif|Left pose vibekinggray down.gif|Down pose vibekinggray up.gif|Up pose vibekinggray right.gif|Right pose vibekinggray left.png|Static left pose vibekinggray down.png|Static down pose vibekinggray up.png|Static up pose vibekinggray right.png|Static right pose vibekinggray leftmiss.gif|Left miss pose vibekinggray downmiss.gif|Down miss pose vibekinggray upmiss.gif|Up miss pose vibekinggray rightmiss.gif|Right miss pose vibekinggray leftmiss.png|Static left miss pose vibekinggray downmiss.png|Static down miss pose vibekinggray upmiss.png|Static up miss pose vibekinggray rightmiss.png|Static right miss pose </gallery> ===Bray=== {{Infobox character |name=Bray<!--name in files; full name may be different--> |image=bray idle.gif }} <gallery> bray idle.png|Static idle pose bray left.gif|Left pose bray down.gif|Down pose bray up.gif|Up pose bray right.gif|Right pose bray left.png|Static left pose bray down.png|Static down pose bray up.png|Static up pose bray right.png|Static right pose </gallery> ===Kana=== {{Infobox character |name=Kana |image=<gallery> Kana idle.gif|Normal Kanadark idle.gif|Dark </gallery> |icons=kana icons.png }} <tabber> |-|Normal= <gallery> Kana idle.png|Static idle pose Kana left.gif|Left pose Kana down.gif|Down pose Kana up.gif|Up pose Kana right.gif|Right pose Kana left.png|Static left pose Kana down.png|Static down pose Kana up.png|Static up pose Kana right.png|Static right pose </gallery> |-|Dark= <gallery> Kanadark idle.png|Static idle pose Kanadark left.gif|Left pose Kanadark down.gif|Down pose Kanadark up.gif|Up pose Kanadark right.gif|Right pose Kanadark left.png|Static left pose Kanadark down.png|Static down pose Kanadark up.png|Static up pose Kanadark right.png|Static right pose </gallery> </tabber> ===Pluto=== {{Infobox character |name=Pluto |image=Plutocqmics idle.gif }} <gallery> Plutocqmics idle.png|Static idle pose Plutocqmics left.gif|Left pose Plutocqmics down.gif|Down pose Plutocqmics up.gif|Up pose Plutocqmics right.gif|Right pose Plutocqmics left.png|Static left pose Plutocqmics down.png|Static down pose Plutocqmics up.png|Static up pose Plutocqmics right.png|Static right pose Plutocqmics leftmiss.gif|Left miss pose Plutocqmics downmiss.gif|Down miss pose Plutocqmics upmiss.gif|Up miss pose Plutocqmics rightmiss.gif|Right miss pose Plutocqmics leftmiss.png|Static left miss pose Plutocqmics downmiss.png|Static down miss pose Plutocqmics upmiss.png|Static up miss pose Plutocqmics rightmiss.png|Static right miss pose </gallery> ===Boyfriend=== {{Infobox character |name=Boyfriend |image=bfcqmics idle.gif |icons=bfcqmics icons.png }} <gallery> bfcqmics idle.png|Static idle pose bfcqmics left.gif|Left pose bfcqmics down.gif|Down pose bfcqmics up.gif|Up pose bfcqmics right.gif|Right pose bfcqmics left.png|Static left pose bfcqmics down.png|Static down pose bfcqmics up.png|Static up pose bfcqmics right.png|Static right pose bfcqmics leftmiss.gif|Left miss pose bfcqmics downmiss.gif|Down miss pose bfcqmics upmiss.gif|Up miss pose bfcqmics rightmiss.gif|Right miss pose bfcqmics leftmiss.png|Static left miss pose bfcqmics downmiss.png|Static down miss pose bfcqmics upmiss.png|Static up miss pose bfcqmics rightmiss.png|Static right miss pose bfcqmics die.gif|Game over bfcqmics die.png|Static game over bfcqmics icon.png|Normal icon bfcqmics iconlose.png|Danger icon </gallery> }} ==Music== ===Main=== {{SongInfo |name=Bearrito |icon= |file=Bearrito.mp3 |inst=Bearrito inst.mp3 |vocal=Bearrito vocal.mp3 |bordercolor= |bpm= |scroll= |maxscore= |time= |duration= |composer= |lyrics= |key= |extra= }} {{SongInfo |name=Bomb Drop |icon= |file=Bomb Drop.mp3 |inst=Bomb Drop inst.mp3 |vocal=Bomb Drop vocal.mp3 }} {{SongInfo |name=In due Time |icon= |file=In due Time.mp3 |inst=In due Time inst.mp3 |vocal=In due Time vocal.mp3 }} {{SongInfo |name=Reanimated |icon= |file=Reanimated - Cqmics.mp3 |inst=Reanimated - Cqmics inst.mp3 |vocal=Reanimated - Cqmics vocal.mp3 }} {{SongInfo |name=Nowhere Land |icon= |file=Nowhere Land.mp3 |inst=Nowhere Land inst.mp3 |vocal=Nowhere Land vocal.mp3 }} {{SongInfo |name=Peteplank |icon= |file=Peteplank.mp3 |inst=Peteplank inst.mp3 |vocal=Peteplank vocal.mp3 }} {{SongInfo |name=Boned |icon= |file=Boned.mp3 |inst=Boned inst.mp3 |vocal=Boned vocal.mp3 }} {{SongInfo |name=Monster Hunter |icon= |file=Monster Hunter.mp3 |inst=Monster Hunter inst.mp3 |vocal=Monster Hunter vocal.mp3 }} {{SongInfo |name=Demented |icon= |file=Demented - Cqmics.mp3 |inst=Demented - Cqmics inst.mp3 |vocal=Demented - Cqmics vocal.mp3 }} {{SongInfo |name=Hump House 4 |icon= |file=Hump House 4.mp3 |inst=Hump House 4 inst.mp3 |vocal=Hump House 4 vocal.mp3 }} ===Covers=== {{SongInfo |name=Race War |icon= |file=Race War (Cqmics).mp3 |inst=RaceWarInst.mp3 |vocal=Race War (Cqmics) vocal.mp3 }} {{SongInfo |name=Boogieman |icon= |file=Boogieman (Cqmics).mp3 |inst=BoogiemanInst.mp3 |vocal=Boogieman (Cqmics) vocal.mp3 }} {{SongInfo |name=Door Stuck |icon= |file=Door Stuck (Cqmics).mp3 |inst=Door Stuck inst.mp3 |vocal=Door Stuck (Cqmics) vocal.mp3 }} {{SongInfo |name=Abuse |icon= |file=Abuse (Cqmics).mp3 |inst=Abuse inst.ogg |vocal=Abuse (Cqmics) vocal.mp3 }} {{SongInfo |name=Miller |icon= |file=Miller (Cqmics).mp3 |inst=MILLERINST.mp3 |vocal=Miller (Cqmics) vocal.mp3 }} {{SongInfo |name=Tophat Guy |icon= |file=Tophat Guy (Cqmics).mp3 |inst=TOPHAT GUY ft Razzy inst.mp3 |vocal=Tophat Guy (Cqmics) vocal.mp3 }} </tabber> ==Trivia== ==Gallery== <gallery> Cqmics Funkin logo.png|Static logo </gallery> ==Download== *[https://gamebanana.com/mods/447472 GameBanana] [[Category:Friday Night Funkin' mods]] 7332850100022c8807ca2a8699f3b41ac1918e14 Alex 0 36 1081 2023-10-28T22:25:38Z JsfasdF256 2 Created page with "{{stub}} {{Infobox character |name=Alex |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Alex''' is the deuteragonist of the webcomic [[HeartStone Destiny]]. [[Category:Characters]]" wikitext text/x-wiki {{stub}} {{Infobox character |name=Alex |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Alex''' is the deuteragonist of the webcomic [[HeartStone Destiny]]. [[Category:Characters]] f3995c341778fcc325e3696b450fff89381e5f0f Halloween Special Part I 0 37 1082 2023-10-31T23:38:51Z JsfasdF256 2 Created page with "{{stub}} Halloween Special Part I is the 15th episode of ''HeartStone Destiny'', released on October 19, 2023. ==Plot== ==Transcript== ==Trivia== [[Category:Episodes]]" wikitext text/x-wiki {{stub}} Halloween Special Part I is the 15th episode of ''HeartStone Destiny'', released on October 19, 2023. ==Plot== ==Transcript== ==Trivia== [[Category:Episodes]] 948901ab43168425a44e460a05fd25fd00ad059b MediaWiki:Gadget-switcher.js 8 38 1095 1094 2023-11-05T07:16:28Z JsfasdF256 2 12 revisions imported from [[:wikipedia:MediaWiki:Gadget-switcher.js]] javascript text/javascript 'use strict'; $( function () { $.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) { if ( i == 0 ) { mw.loader.using(['mediawiki.util'], function(){mw.util.addCSS('.switcher-container label input{margin-right:0.5em}')}) } var selected, $radio; var switchers = [] var radioName = 'switcher-' + i; $.each( container.children, function ( j, switcher ) { var label = switcher.querySelector( '.switcher-label' ); if ( !label || !label.childNodes.length ) { return; } switchers.push( switcher ); $radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( selected ).hide(); $( switcher ).show(); selected = switcher; } ); if ( !selected ) { // Mark the first one as selected selected = switcher; $radio.prop( 'checked', true ); } else if ( label.getAttribute( 'data-switcher-default' ) !== null ) { // Custom default $radio.click(); } else { // Hide non-default $( switcher ).hide(); } $( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container ); $( label ).remove(); } ); if ( switchers.length > 1 ) { $( '<label style="display:block">Show all</label>' ).prepend( $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () { $( switchers ).show(); selected = switchers; } ) ).appendTo( container ); } if ( switchers.length === 1 ) { $radio.remove(); } } ); } ); a175070d6651aee18a8e80f210c33dce068b8020 Main Page 0 1 1096 1 2023-11-14T23:51:47Z JsfasdF256 2 links wikitext text/x-wiki __NOTOC__ == Welcome to {{SITENAME}}! == This Main Page was created automatically and it seems it hasn't been replaced yet. === For the bureaucrat(s) of this wiki === Hello, and welcome to your new wiki! Thank you for choosing WikiTide for the hosting of your wiki, we hope you will enjoy our hosting. You can immediately start working on your wiki or whenever you want. Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links: * [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users) * [[meta:Special:MyLanguage/FAQ|WikiTide FAQ]] * [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.) ==== I still don't understand X! ==== Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here: * [[meta:Special:MyLanguage/Help center|On our own WikiTide wiki]] * On [[phorge:|Phorge]] * On [https://wikiforge.net/discord Discord] * On IRC in #wikiforge on irc.libera.chat ([irc://irc.libera.chat/%23wikiforge direct link]; [https://web.libera.chat/?channel=#wikiforge webchat]) === For visitors of this wiki === Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later! *[[Alex]] *[[Halloween Special Part I]] *[[Noah]] *[[Vs HeartStone Destiny]] 55aed623e3d82ca8b7b7354be254c17cc05ea2e2 Larry 0 39 1098 2023-11-23T03:38:03Z JsfasdF256 2 Created page with "{{stub}} {{Infobox character |name=Larry |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Larry''' is a character of the webcomic [[HeartStone Destiny]]. [[Category:Characters]]" wikitext text/x-wiki {{stub}} {{Infobox character |name=Larry |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Larry''' is a character of the webcomic [[HeartStone Destiny]]. [[Category:Characters]] 4dbb2c2a819814e6769d866f9c642bd355eff873